Improve file api

This commit is contained in:
2025-05-12 11:19:31 +08:00
parent 5af84dbcf3
commit 6a9f8e2f62
2 changed files with 15 additions and 88 deletions

View File

@@ -422,17 +422,14 @@ class Network {
} }
} }
async uploadFileBlock(fileId: number, index: number, blockData: Blob): Promise<Response<any>> { async uploadFileBlock(fileId: number, index: number, blockData: ArrayBuffer): Promise<Response<any>> {
try { try {
const formData = new FormData();
formData.append('block', blockData);
const response = await axios.post( const response = await axios.post(
`${this.apiBaseUrl}/files/upload/block/${fileId}/${index}`, `${this.apiBaseUrl}/files/upload/block/${fileId}/${index}`,
formData, blockData,
{ {
headers: { headers: {
'Content-Type': 'multipart/form-data' 'Content-Type': 'application/octet-stream',
} }
} }
); );

View File

@@ -3,8 +3,6 @@ package api
import ( import (
"fmt" "fmt"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/log"
"mime/multipart"
"nysoure/server/model" "nysoure/server/model"
"nysoure/server/service" "nysoure/server/service"
"strconv" "strconv"
@@ -23,7 +21,6 @@ func AddFileRoutes(router fiber.Router) {
} }
} }
// initUpload 初始化文件上传过程
func initUpload(c fiber.Ctx) error { func initUpload(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)
@@ -37,10 +34,7 @@ func initUpload(c fiber.Ctx) error {
var req InitUploadRequest var req InitUploadRequest
if err := c.Bind().Body(&req); err != nil { if err := c.Bind().Body(&req); err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid request parameters")
Success: false,
Message: "无效的请求参数",
})
} }
result, err := service.CreateUploadingFile(uid, req.Filename, req.Description, req.FileSize, req.ResourceID, req.StorageID) result, err := service.CreateUploadingFile(uid, req.Filename, req.Description, req.FileSize, req.ResourceID, req.StorageID)
@@ -54,62 +48,20 @@ func initUpload(c fiber.Ctx) error {
}) })
} }
// uploadBlock 上传文件块
func uploadBlock(c fiber.Ctx) error { func uploadBlock(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)
id, err := strconv.ParseUint(c.Params("id"), 10, 32) id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid file ID")
Success: false,
Message: "无效的文件ID",
})
} }
index, err := strconv.Atoi(c.Params("index")) index, err := strconv.Atoi(c.Params("index"))
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid block index")
Success: false,
Message: "无效的块索引",
})
} }
file, err := c.Request().MultipartForm() data := c.Body()
if err != nil {
return c.JSON(model.Response[any]{
Success: false,
Message: "无效的文件数据",
})
}
if len(file.File["block"]) == 0 {
return c.JSON(model.Response[any]{
Success: false,
Message: "没有找到文件块",
})
}
fileHeader := file.File["block"][0]
fileContent, err := fileHeader.Open()
if err != nil {
log.Error("打开文件块失败: ", err)
return c.JSON(model.Response[any]{
Success: false,
Message: "打开文件块失败",
})
}
defer func(fileContent multipart.File) {
_ = fileContent.Close()
}(fileContent)
data := make([]byte, fileHeader.Size)
if _, err := fileContent.Read(data); err != nil {
log.Error("读取文件块失败: ", err)
return c.JSON(model.Response[any]{
Success: false,
Message: "读取文件块失败",
})
}
if err := service.UploadBlock(uid, uint(id), index, data); err != nil { if err := service.UploadBlock(uid, uint(id), index, data); err != nil {
return err return err
@@ -117,20 +69,16 @@ func uploadBlock(c fiber.Ctx) error {
return c.JSON(model.Response[any]{ return c.JSON(model.Response[any]{
Success: true, Success: true,
Message: fmt.Sprintf("块 %d 上传成功", index), Message: fmt.Sprintf("Block %d uploaded successfully", index),
}) })
} }
// finishUpload 完成文件上传
func finishUpload(c fiber.Ctx) error { func finishUpload(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)
id, err := strconv.ParseUint(c.Params("id"), 10, 32) id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid file ID")
Success: false,
Message: "无效的文件ID",
})
} }
result, err := service.FinishUploadingFile(uid, uint(id)) result, err := service.FinishUploadingFile(uid, uint(id))
@@ -157,10 +105,7 @@ func createRedirectFile(c fiber.Ctx) error {
var req CreateRedirectFileRequest var req CreateRedirectFileRequest
if err := c.Bind().Body(&req); err != nil { if err := c.Bind().Body(&req); err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid request parameters")
Success: false,
Message: "无效的请求参数",
})
} }
result, err := service.CreateRedirectFile(uid, req.Filename, req.Description, req.ResourceID, req.RedirectURL) result, err := service.CreateRedirectFile(uid, req.Filename, req.Description, req.ResourceID, req.RedirectURL)
@@ -174,14 +119,10 @@ func createRedirectFile(c fiber.Ctx) error {
}) })
} }
// getFile 获取文件信息
func getFile(c fiber.Ctx) error { func getFile(c fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 32) id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid file ID")
Success: false,
Message: "无效的文件ID",
})
} }
file, err := service.GetFile(uint(id)) file, err := service.GetFile(uint(id))
@@ -195,16 +136,12 @@ func getFile(c fiber.Ctx) error {
}) })
} }
// updateFile 更新文件信息
func updateFile(c fiber.Ctx) error { func updateFile(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)
id, err := strconv.ParseUint(c.Params("id"), 10, 32) id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid file ID")
Success: false,
Message: "无效的文件ID",
})
} }
type UpdateFileRequest struct { type UpdateFileRequest struct {
@@ -214,10 +151,7 @@ func updateFile(c fiber.Ctx) error {
var req UpdateFileRequest var req UpdateFileRequest
if err := c.Bind().Body(&req); err != nil { if err := c.Bind().Body(&req); err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid request parameters")
Success: false,
Message: "无效的请求参数",
})
} }
result, err := service.UpdateFile(uid, uint(id), req.Filename, req.Description) result, err := service.UpdateFile(uid, uint(id), req.Filename, req.Description)
@@ -231,16 +165,12 @@ func updateFile(c fiber.Ctx) error {
}) })
} }
// deleteFile 删除文件
func deleteFile(c fiber.Ctx) error { func deleteFile(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)
id, err := strconv.ParseUint(c.Params("id"), 10, 32) id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil { if err != nil {
return c.JSON(model.Response[any]{ return model.NewRequestError("Invalid file ID")
Success: false,
Message: "无效的文件ID",
})
} }
if err := service.DeleteFile(uid, uint(id)); err != nil { if err := service.DeleteFile(uid, uint(id)); err != nil {
@@ -249,6 +179,6 @@ func deleteFile(c fiber.Ctx) error {
return c.JSON(model.Response[any]{ return c.JSON(model.Response[any]{
Success: true, Success: true,
Message: "文件删除成功", Message: "File deleted successfully",
}) })
} }