From 6a9f8e2f62039fa27b8641948c9150f2adbede03 Mon Sep 17 00:00:00 2001 From: nyne Date: Mon, 12 May 2025 11:19:31 +0800 Subject: [PATCH] Improve file api --- frontend/src/network/network.ts | 9 ++-- server/api/file.go | 94 +++++---------------------------- 2 files changed, 15 insertions(+), 88 deletions(-) diff --git a/frontend/src/network/network.ts b/frontend/src/network/network.ts index 75fd402..9c249af 100644 --- a/frontend/src/network/network.ts +++ b/frontend/src/network/network.ts @@ -422,17 +422,14 @@ class Network { } } - async uploadFileBlock(fileId: number, index: number, blockData: Blob): Promise> { + async uploadFileBlock(fileId: number, index: number, blockData: ArrayBuffer): Promise> { try { - const formData = new FormData(); - formData.append('block', blockData); - const response = await axios.post( `${this.apiBaseUrl}/files/upload/block/${fileId}/${index}`, - formData, + blockData, { headers: { - 'Content-Type': 'multipart/form-data' + 'Content-Type': 'application/octet-stream', } } ); diff --git a/server/api/file.go b/server/api/file.go index ef4691d..4d59faf 100644 --- a/server/api/file.go +++ b/server/api/file.go @@ -3,8 +3,6 @@ package api import ( "fmt" "github.com/gofiber/fiber/v3" - "github.com/gofiber/fiber/v3/log" - "mime/multipart" "nysoure/server/model" "nysoure/server/service" "strconv" @@ -23,7 +21,6 @@ func AddFileRoutes(router fiber.Router) { } } -// initUpload 初始化文件上传过程 func initUpload(c fiber.Ctx) error { uid := c.Locals("uid").(uint) @@ -37,10 +34,7 @@ func initUpload(c fiber.Ctx) error { var req InitUploadRequest if err := c.Bind().Body(&req); err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的请求参数", - }) + return model.NewRequestError("Invalid request parameters") } 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 { uid := c.Locals("uid").(uint) id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的文件ID", - }) + return model.NewRequestError("Invalid file ID") } index, err := strconv.Atoi(c.Params("index")) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的块索引", - }) + return model.NewRequestError("Invalid block index") } - file, err := c.Request().MultipartForm() - 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: "读取文件块失败", - }) - } + data := c.Body() if err := service.UploadBlock(uid, uint(id), index, data); err != nil { return err @@ -117,20 +69,16 @@ func uploadBlock(c fiber.Ctx) error { return c.JSON(model.Response[any]{ Success: true, - Message: fmt.Sprintf("块 %d 上传成功", index), + Message: fmt.Sprintf("Block %d uploaded successfully", index), }) } -// finishUpload 完成文件上传 func finishUpload(c fiber.Ctx) error { uid := c.Locals("uid").(uint) id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的文件ID", - }) + return model.NewRequestError("Invalid file ID") } result, err := service.FinishUploadingFile(uid, uint(id)) @@ -157,10 +105,7 @@ func createRedirectFile(c fiber.Ctx) error { var req CreateRedirectFileRequest if err := c.Bind().Body(&req); err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的请求参数", - }) + return model.NewRequestError("Invalid request parameters") } 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 { id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的文件ID", - }) + return model.NewRequestError("Invalid file ID") } file, err := service.GetFile(uint(id)) @@ -195,16 +136,12 @@ func getFile(c fiber.Ctx) error { }) } -// updateFile 更新文件信息 func updateFile(c fiber.Ctx) error { uid := c.Locals("uid").(uint) id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的文件ID", - }) + return model.NewRequestError("Invalid file ID") } type UpdateFileRequest struct { @@ -214,10 +151,7 @@ func updateFile(c fiber.Ctx) error { var req UpdateFileRequest if err := c.Bind().Body(&req); err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的请求参数", - }) + return model.NewRequestError("Invalid request parameters") } 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 { uid := c.Locals("uid").(uint) id, err := strconv.ParseUint(c.Params("id"), 10, 32) if err != nil { - return c.JSON(model.Response[any]{ - Success: false, - Message: "无效的文件ID", - }) + return model.NewRequestError("Invalid file ID") } 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]{ Success: true, - Message: "文件删除成功", + Message: "File deleted successfully", }) }