完成文件上传功能
This commit is contained in:
@@ -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))
|
// 关键修正:第三个参数是 i(int 类型,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)
|
||||||
|
|||||||
Reference in New Issue
Block a user