mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 04:17:23 +00:00
Improve file api
This commit is contained in:
@@ -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',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@@ -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",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user