one-api/common/storage/drives/imgur.go
2024-04-18 18:51:09 +08:00

78 lines
1.6 KiB
Go

package drives
import (
"bytes"
"fmt"
"net/http"
"one-api/common/requester"
)
var imgurUploadURL = "https://api.imgur.com/3/image"
type ImgurUpload struct {
ClientId string
}
func NewImgurUpload(clientId string) *ImgurUpload {
return &ImgurUpload{
ClientId: clientId,
}
}
type ImgurResponse struct {
Status int `json:"status"`
Success bool `json:"success"`
Data ImgurData `json:"data,omitempty"`
}
type ImgurData struct {
Link string `json:"link"`
}
func (i *ImgurUpload) Name() string {
return "Imgur"
}
func (i *ImgurUpload) Upload(data []byte, fileName string) (string, error) {
client := requester.NewHTTPRequester("", nil)
var formBody bytes.Buffer
builder := client.CreateFormBuilder(&formBody)
err := builder.CreateFormFileReader("image", bytes.NewReader(data), fileName)
if err != nil {
return "", fmt.Errorf("creating form file: %w", err)
}
builder.Close()
headers := map[string]string{
"Authorization": "Client-ID " + i.ClientId,
}
req, err := client.NewRequest(
http.MethodPost,
imgurUploadURL,
client.WithBody(&formBody),
client.WithHeader(headers),
client.WithContentType(builder.FormDataContentType()))
req.ContentLength = int64(formBody.Len())
if err != nil {
return "", fmt.Errorf("new request failed: %w", err)
}
defer req.Body.Close()
imgurResponse := &ImgurResponse{}
_, errWithCode := client.SendRequest(req, imgurResponse, false)
if errWithCode != nil {
return "", fmt.Errorf("%s", errWithCode.Message)
}
if !imgurResponse.Success {
return "", fmt.Errorf("upload failed Status: %d", imgurResponse.Status)
}
return imgurResponse.Data.Link, nil
}