From df031d5eddc3dc581e228bfcd9a327b9f169cdd5 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 1 Oct 2023 13:29:04 +0000 Subject: Cleanup file upload functions --- mastodon/status.go | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) (limited to 'mastodon/status.go') diff --git a/mastodon/status.go b/mastodon/status.go index f860c31..20f74a5 100644 --- a/mastodon/status.go +++ b/mastodon/status.go @@ -1,12 +1,14 @@ package mastodon import ( + "bytes" "context" "fmt" "io" "mime/multipart" "net/http" "net/url" + "path/filepath" "time" ) @@ -293,30 +295,35 @@ func (c *Client) Search(ctx context.Context, q string, qType string, limit int, return &results, nil } -// UploadMedia upload a media attachment from a file. -func (c *Client) UploadMedia(ctx context.Context, file string) (*Attachment, error) { - var attachment Attachment - err := c.doAPI(ctx, http.MethodPost, "/api/v1/media", file, &attachment, nil) +func (c *Client) UploadMediaFromMultipartFileHeader(ctx context.Context, fh *multipart.FileHeader) (*Attachment, error) { + f, err := fh.Open() if err != nil { return nil, err } - return &attachment, nil -} + defer f.Close() -// UploadMediaFromReader uploads a media attachment from a io.Reader. -func (c *Client) UploadMediaFromReader(ctx context.Context, reader io.Reader) (*Attachment, error) { - var attachment Attachment - err := c.doAPI(ctx, http.MethodPost, "/api/v1/media", reader, &attachment, nil) + var buf bytes.Buffer + mw := multipart.NewWriter(&buf) + fname := filepath.Base(fh.Filename) + err = mw.WriteField("description", fname) if err != nil { return nil, err } - return &attachment, nil -} - -// UploadMediaFromReader uploads a media attachment from a io.Reader. -func (c *Client) UploadMediaFromMultipartFileHeader(ctx context.Context, fh *multipart.FileHeader) (*Attachment, error) { + part, err := mw.CreateFormFile("file", fname) + if err != nil { + return nil, err + } + _, err = io.Copy(part, f) + if err != nil { + return nil, err + } + err = mw.Close() + if err != nil { + return nil, err + } + params := &multipartRequest{Data: &buf, ContentType: mw.FormDataContentType()} var attachment Attachment - err := c.doAPI(ctx, http.MethodPost, "/api/v1/media", fh, &attachment, nil) + err = c.doAPI(ctx, http.MethodPost, "/api/v1/media", params, &attachment, nil) if err != nil { return nil, err } -- cgit v1.2.3