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

92 lines
2.0 KiB
Go

package drives
import (
"bytes"
"fmt"
"net/http"
"one-api/common/requester"
)
var smUploadURL = "https://sm.ms/api/v2/upload"
type SMUpload struct {
Secret string
}
type SMData struct {
URL string `json:"url"`
// FileID int `json:"file_id"`
// Width int `json:"width"`
// Height int `json:"height"`
// Filename string `json:"filename"`
// Storename string `json:"storename"`
// Size int `json:"size"`
// Path string `json:"path"`
// Hash string `json:"hash"`
// Delete string `json:"delete"`
// Page string `json:"page"`
}
type SMResponse struct {
Success bool `json:"success"`
Code string `json:"code"`
Message string `json:"message"`
Data SMData `json:"data,omitempty"`
RequestID string `json:"RequestId"`
}
func NewSMUpload(secret string) *SMUpload {
return &SMUpload{
Secret: secret,
}
}
func (sm *SMUpload) Name() string {
return "SM.MS"
}
func (sm *SMUpload) Upload(data []byte, fileName string) (string, error) {
client := requester.NewHTTPRequester("", nil)
var formBody bytes.Buffer
builder := client.CreateFormBuilder(&formBody)
err := builder.CreateFormFileReader("smfile", bytes.NewReader(data), fileName)
if err != nil {
return "", fmt.Errorf("creating form file: %w", err)
}
builder.WriteField("format", "json")
builder.Close()
headers := map[string]string{
"Content-type": "application/json",
"Authorization": sm.Secret,
}
req, err := client.NewRequest(
http.MethodPost,
smUploadURL,
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()
smResponse := &SMResponse{}
_, errWithCode := client.SendRequest(req, smResponse, false)
if errWithCode != nil {
return "", fmt.Errorf("%s", errWithCode.Message)
}
if !smResponse.Success {
return "", fmt.Errorf("upload failed: %s", smResponse.Message)
}
return smResponse.Data.URL, nil
}