Files
go-123pan-pic/internal/pan123/upload.go
2026-04-09 03:24:27 +08:00

109 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package pan123
import (
"encoding/json"
"fmt"
)
// CreateFile 步骤1: 创建文件/发卷预申报。123pan 会下发预上传 IDpreuploadID或判定直接秒传。
func (c *Client) CreateFile(parentFileID, filename, etag string, size int64) (*CreateFileRespData, error) {
reqBody := CreateFileReq{
ParentFileID: parentFileID,
Filename: filename,
Etag: etag,
Size: size,
Type: 1,
}
var resp BaseResp
// 上传接口大部分挂在 UploadBaseURL + /upload/v1/xxx
err := c.DoJSONRequest("POST", UploadBaseURL+"/upload/v1/oss/file/create", reqBody, &resp)
if err != nil {
return nil, err
}
if resp.Code != 0 {
return nil, fmt.Errorf("123pan API error (create file), code: %d, msg: %s", resp.Code, resp.Message)
}
var data CreateFileRespData
if err := json.Unmarshal(resp.Data, &data); err != nil {
return nil, fmt.Errorf("decode create_file data error: %w", err)
}
return &data, nil
}
// GetUploadURL 步骤2: 凭借传入的 preuploadID 及 切片编号(对于整体直接设为1即可) 换取可以真正上传二进制的预签名 URL。
func (c *Client) GetUploadURL(preuploadID string, sliceNo int) (*GetUploadURLRespData, error) {
reqBody := GetUploadURLReq{
PreuploadID: preuploadID,
SliceNo: sliceNo,
}
var resp BaseResp
err := c.DoJSONRequest("POST", UploadBaseURL+"/upload/v1/oss/file/get_upload_url", reqBody, &resp)
if err != nil {
return nil, err
}
if resp.Code != 0 {
return nil, fmt.Errorf("123pan API error (get upload url), code: %d, msg: %s", resp.Code, resp.Message)
}
var data GetUploadURLRespData
if err := json.Unmarshal(resp.Data, &data); err != nil {
return nil, fmt.Errorf("decode get_upload_url data error: %w", err)
}
return &data, nil
}
// UploadComplete 步骤4 (由于步骤3是调用泛化的 DoRawPUT 进行的纯数据上传): 当步骤3全部走完时调用此 API 宣告物理上传完毕
func (c *Client) UploadComplete(preuploadID string) (*UploadCompleteRespData, error) {
reqBody := UploadCompleteReq{
PreuploadID: preuploadID,
}
var resp BaseResp
err := c.DoJSONRequest("POST", UploadBaseURL+"/upload/v1/oss/file/upload_complete", reqBody, &resp)
if err != nil {
return nil, err
}
if resp.Code != 0 {
return nil, fmt.Errorf("123pan API error (upload complete), code: %d, msg: %s", resp.Code, resp.Message)
}
var data UploadCompleteRespData
if err := json.Unmarshal(resp.Data, &data); err != nil {
return nil, fmt.Errorf("decode upload_complete data error: %w", err)
}
return &data, nil
}
// CheckAsyncResult 步骤5 (如需): 若上一步返回的数据指出 async == true 且 completed == false那么需轮询此 API
func (c *Client) CheckAsyncResult(preuploadID string) (*UploadAsyncResultRespData, error) {
reqBody := UploadAsyncResultReq{
PreuploadID: preuploadID,
}
var resp BaseResp
err := c.DoJSONRequest("POST", UploadBaseURL+"/upload/v1/oss/file/upload_async_result", reqBody, &resp)
if err != nil {
return nil, err
}
if resp.Code != 0 {
return nil, fmt.Errorf("123pan API error (async result query), code: %d, msg: %s", resp.Code, resp.Message)
}
var data UploadAsyncResultRespData
if err := json.Unmarshal(resp.Data, &data); err != nil {
return nil, fmt.Errorf("decode async_result data error: %w", err)
}
return &data, nil
}