完成文件上传功能

This commit is contained in:
2025-11-01 19:37:26 +08:00
parent 5453ae9126
commit d3f873522f

View File

@@ -27,6 +27,11 @@ type UploadFileLogic struct {
c *gin.Context c *gin.Context
} }
type partETag struct {
PartNumber int
ETag string
}
func NewUploadFileLogic(ctx context.Context, cfg *config.Config, c *gin.Context) *UploadFileLogic { func NewUploadFileLogic(ctx context.Context, cfg *config.Config, c *gin.Context) *UploadFileLogic {
return &UploadFileLogic{ return &UploadFileLogic{
Logger: logx.WithContext(ctx), Logger: logx.WithContext(ctx),
@@ -135,7 +140,7 @@ func (l *UploadFileLogic) UploadFile() (resp *types.UploadFileResp, err error) {
const partSize = 100 * 1024 // 100KB const partSize = 100 * 1024 // 100KB
totalSize := fileHeader.Size totalSize := fileHeader.Size
partCount := (totalSize + partSize - 1) / partSize partCount := (totalSize + partSize - 1) / partSize
var partETags []oss.PartETag var partETags []oss.UploadPart // 修正:使用 SDK 内置类型
// 重置文件指针 // 重置文件指针
if _, err = file.Seek(0, 0); err != nil { if _, err = file.Seek(0, 0); err != nil {
@@ -163,15 +168,15 @@ func (l *UploadFileLogic) UploadFile() (resp *types.UploadFileResp, err error) {
if partEnd > totalSize { if partEnd > totalSize {
partEnd = totalSize partEnd = totalSize
} }
partLen := partEnd - partStart partLen := partEnd - partStart // int64 类型(正确)
// 读取分片数据 // 读取分片数据(不变)
data := make([]byte, partLen) data := make([]byte, partLen)
if _, err = file.Seek(partStart, 0); err != nil { if _, err = file.Seek(partStart, 0); err != nil {
_ = bucket.AbortMultipartUpload(imur) _ = bucket.AbortMultipartUpload(imur)
l.c.JSON(http.StatusInternalServerError, gin.H{ l.c.JSON(http.StatusInternalServerError, gin.H{
"code": 500, "code": 500,
"message": fmt.Sprintf("定位分片%d失败", i), "message": fmt.Sprintf("定位分片%d失败: %v", i, err),
}) })
return return
} }
@@ -179,34 +184,34 @@ func (l *UploadFileLogic) UploadFile() (resp *types.UploadFileResp, err error) {
_ = bucket.AbortMultipartUpload(imur) _ = bucket.AbortMultipartUpload(imur)
l.c.JSON(http.StatusInternalServerError, gin.H{ l.c.JSON(http.StatusInternalServerError, gin.H{
"code": 500, "code": 500,
"message": fmt.Sprintf("读取分片%d失败", i), "message": fmt.Sprintf("读取分片%d失败: %v", i, err),
}) })
return return
} }
// 上传分片(旧版:传入 imur var partResult oss.UploadPart // 正确类型:分片上传结果
partResult, err := bucket.UploadPart(imur, i, bytes.NewReader(data)) // 关键修正:第三个参数是 iint 类型1 开始,符合 1-10000 范围)
partResult, err = bucket.UploadPart(imur, bytes.NewReader(data), partLen, i)
if err != nil { if err != nil {
_ = bucket.AbortMultipartUpload(imur) _ = bucket.AbortMultipartUpload(imur)
l.c.JSON(http.StatusInternalServerError, gin.H{ l.c.JSON(http.StatusInternalServerError, gin.H{
"code": 500, "code": 500,
"message": fmt.Sprintf("上传分片%d失败", i), "message": fmt.Sprintf("上传分片%d失败: %v", i, err),
}) })
return return
} }
partETags = append(partETags, oss.PartETag{ partETags = append(partETags, oss.UploadPart{
PartNumber: i, PartNumber: i,
ETag: partResult.ETag, ETag: partResult.ETag,
}) })
} }
// 8.3 按分片号排序(必须) // 8.3 按分片号排序(必须)
sort.Slice(partETags, func(i, j int) bool { sort.Slice(partETags, func(i, j int) bool {
return partETags[i].PartNumber < partETags[j].PartNumber return partETags[i].PartNumber < partETags[j].PartNumber
}) })
// 8.4 完成分片上传(旧版:传入 imur // 8.4 完成分片上传(类型已匹配,无报错
_, err = bucket.CompleteMultipartUpload(imur, partETags) _, err = bucket.CompleteMultipartUpload(imur, partETags)
if err != nil { if err != nil {
_ = bucket.AbortMultipartUpload(imur) _ = bucket.AbortMultipartUpload(imur)