Skip to content

Commit eeaa828

Browse files
committed
feat(v2): api upload
1 parent 82133f5 commit eeaa828

File tree

3 files changed

+215
-1
lines changed

3 files changed

+215
-1
lines changed

v2/api_upload.go

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package lark
2+
3+
// Import from Lark API Go demo
4+
// with adaption to go-lark frame
5+
6+
import (
7+
"bytes"
8+
"context"
9+
"fmt"
10+
"image"
11+
"image/jpeg"
12+
"io"
13+
"mime/multipart"
14+
"net/http"
15+
"os"
16+
)
17+
18+
const (
19+
uploadImageURL = "/open-apis/im/v1/images"
20+
uploadFileURL = "/open-apis/im/v1/files"
21+
)
22+
23+
// UploadImageResponse .
24+
type UploadImageResponse struct {
25+
BaseResponse
26+
Data struct {
27+
ImageKey string `json:"image_key"`
28+
} `json:"data"`
29+
}
30+
31+
// UploadFileRequest .
32+
type UploadFileRequest struct {
33+
FileType string `json:"-"`
34+
FileName string `json:"-"`
35+
Duration int `json:"-"`
36+
Path string `json:"-"`
37+
Reader io.Reader `json:"-"`
38+
}
39+
40+
// UploadFileResponse .
41+
type UploadFileResponse struct {
42+
BaseResponse
43+
Data struct {
44+
FileKey string `json:"file_key"`
45+
} `json:"data"`
46+
}
47+
48+
// UploadImage uploads image file
49+
func (bot Bot) UploadImage(ctx context.Context, path string) (*UploadImageResponse, error) {
50+
file, err := os.Open(path)
51+
if err != nil {
52+
return nil, err
53+
}
54+
defer file.Close()
55+
56+
body := &bytes.Buffer{}
57+
writer := multipart.NewWriter(body)
58+
writer.WriteField("image_type", "message")
59+
part, err := writer.CreateFormFile("image", path)
60+
if err != nil {
61+
return nil, err
62+
}
63+
_, err = io.Copy(part, file)
64+
if err != nil {
65+
return nil, err
66+
}
67+
err = writer.Close()
68+
if err != nil {
69+
return nil, err
70+
}
71+
var respData UploadImageResponse
72+
header := make(http.Header)
73+
header.Set("Content-Type", writer.FormDataContentType())
74+
err = bot.PerformAPIRequest(ctx, "POST", "UploadImage", uploadImageURL, header, true, body, &respData)
75+
if err != nil {
76+
return nil, err
77+
}
78+
return &respData, err
79+
}
80+
81+
// UploadImageObject uploads image object
82+
func (bot Bot) UploadImageObject(ctx context.Context, img image.Image) (*UploadImageResponse, error) {
83+
body := &bytes.Buffer{}
84+
writer := multipart.NewWriter(body)
85+
writer.WriteField("image_type", "message")
86+
part, err := writer.CreateFormFile("image", "temp_image")
87+
if err != nil {
88+
return nil, err
89+
}
90+
err = jpeg.Encode(part, img, nil)
91+
if err != nil {
92+
return nil, err
93+
}
94+
err = writer.Close()
95+
if err != nil {
96+
return nil, err
97+
}
98+
var respData UploadImageResponse
99+
header := make(http.Header)
100+
header.Set("Content-Type", writer.FormDataContentType())
101+
err = bot.PerformAPIRequest(ctx, "POST", "UploadImage", uploadImageURL, header, true, body, &respData)
102+
if err != nil {
103+
return nil, err
104+
}
105+
return &respData, err
106+
}
107+
108+
// UploadFile uploads file to Lark server
109+
func (bot Bot) UploadFile(ctx context.Context, req UploadFileRequest) (*UploadFileResponse, error) {
110+
var content io.Reader
111+
if req.Reader == nil {
112+
file, err := os.Open(req.Path)
113+
if err != nil {
114+
return nil, err
115+
}
116+
defer file.Close()
117+
content = file
118+
} else {
119+
content = req.Reader
120+
req.Path = req.FileName
121+
}
122+
123+
body := &bytes.Buffer{}
124+
writer := multipart.NewWriter(body)
125+
writer.WriteField("file_type", req.FileType)
126+
writer.WriteField("file_name", req.FileName)
127+
if req.FileType == "mp4" && req.Duration > 0 {
128+
writer.WriteField("duration", fmt.Sprintf("%d", req.Duration))
129+
}
130+
part, err := writer.CreateFormFile("file", req.Path)
131+
if err != nil {
132+
return nil, err
133+
}
134+
_, err = io.Copy(part, content)
135+
if err != nil {
136+
return nil, err
137+
}
138+
err = writer.Close()
139+
if err != nil {
140+
return nil, err
141+
}
142+
var respData UploadFileResponse
143+
header := make(http.Header)
144+
header.Set("Content-Type", writer.FormDataContentType())
145+
err = bot.PerformAPIRequest(ctx, "POST", "UploadFile", uploadFileURL, header, true, body, &respData)
146+
if err != nil {
147+
return nil, err
148+
}
149+
return &respData, err
150+
}

v2/api_upload_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package lark
2+
3+
import (
4+
"image/jpeg"
5+
"os"
6+
"strings"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestUploadImage(t *testing.T) {
13+
resp, err := bot.UploadImage(t.Context(), "./fixtures/test.jpg")
14+
if assert.NoError(t, err) {
15+
assert.Zero(t, resp.Code)
16+
t.Log(resp.Data.ImageKey)
17+
assert.NotEmpty(t, resp.Data.ImageKey)
18+
}
19+
}
20+
21+
func TestUploadImageObject(t *testing.T) {
22+
file, _ := os.Open("./fixtures/test.jpg")
23+
img, _ := jpeg.Decode(file)
24+
25+
resp, err := bot.UploadImageObject(t.Context(), img)
26+
if assert.NoError(t, err) {
27+
assert.Zero(t, resp.Code)
28+
t.Log(resp.Data.ImageKey)
29+
assert.NotEmpty(t, resp.Data.ImageKey)
30+
}
31+
}
32+
33+
func TestUploadFile(t *testing.T) {
34+
resp, err := bot.UploadFile(
35+
t.Context(),
36+
UploadFileRequest{
37+
FileType: "pdf",
38+
FileName: "hello.pdf",
39+
Path: "./fixtures/test.pdf",
40+
})
41+
if assert.NoError(t, err) {
42+
assert.Zero(t, resp.Code)
43+
t.Log(resp.Data.FileKey)
44+
assert.NotEmpty(t, resp.Data.FileKey)
45+
}
46+
}
47+
48+
func TestUploadFile_Binary(t *testing.T) {
49+
resp, err := bot.UploadFile(
50+
t.Context(),
51+
UploadFileRequest{
52+
FileType: "stream",
53+
FileName: "test-data.csv",
54+
Reader: strings.NewReader(`Name,Age,Location
55+
Foo,25,Sleman
56+
Bar,23,Sidoarjo
57+
Baz,27,Bantul`),
58+
})
59+
if assert.NoError(t, err) {
60+
assert.Zero(t, resp.Code)
61+
t.Log(resp.Data.FileKey)
62+
assert.NotEmpty(t, resp.Data.FileKey)
63+
}
64+
}

v2/event_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func TestPostEvent(t *testing.T) {
3535
}, "POST", "/", message)
3636
assert.Equal(t, "2.0", string(w.Body.Bytes()))
3737

38-
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
38+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
3939
m, _ := json.Marshal(message)
4040
w.Write([]byte(m))
4141
}))

0 commit comments

Comments
 (0)