Add cancel upload functionality to file API

This commit is contained in:
2025-05-12 11:46:52 +08:00
parent 6a9f8e2f62
commit d646cf779d
3 changed files with 60 additions and 1 deletions

View File

@@ -456,6 +456,19 @@ class Network {
} }
} }
async cancelFileUpload(fileId: number): Promise<Response<void>> {
try {
const response = await axios.post(`${this.apiBaseUrl}/files/upload/cancel/${fileId}`);
return response.data;
} catch (e: any) {
console.error(e);
return {
success: false,
message: e.toString(),
};
}
}
async createRedirectFile(filename: string, description: string, async createRedirectFile(filename: string, description: string,
resourceId: number, redirectUrl: string): Promise<Response<RFile>> { resourceId: number, redirectUrl: string): Promise<Response<RFile>> {
try { try {

View File

@@ -14,6 +14,7 @@ func AddFileRoutes(router fiber.Router) {
fileGroup.Post("/upload/init", initUpload) fileGroup.Post("/upload/init", initUpload)
fileGroup.Post("/upload/block/:id/:index", uploadBlock) fileGroup.Post("/upload/block/:id/:index", uploadBlock)
fileGroup.Post("/upload/finish/:id", finishUpload) fileGroup.Post("/upload/finish/:id", finishUpload)
fileGroup.Post("/upload/cancel/:id", cancelUpload)
fileGroup.Post("/redirect", createRedirectFile) fileGroup.Post("/redirect", createRedirectFile)
fileGroup.Get("/:id", getFile) fileGroup.Get("/:id", getFile)
fileGroup.Put("/:id", updateFile) fileGroup.Put("/:id", updateFile)
@@ -92,7 +93,24 @@ func finishUpload(c fiber.Ctx) error {
}) })
} }
// createRedirectFile 创建重定向文件 func cancelUpload(c fiber.Ctx) error {
uid := c.Locals("uid").(uint)
id, err := strconv.ParseUint(c.Params("id"), 10, 32)
if err != nil {
return model.NewRequestError("Invalid file ID")
}
if err := service.CancelUploadingFile(uid, uint(id)); err != nil {
return err
}
return c.JSON(model.Response[any]{
Success: true,
Message: "Upload cancelled successfully",
})
}
func createRedirectFile(c fiber.Ctx) error { func createRedirectFile(c fiber.Ctx) error {
uid := c.Locals("uid").(uint) uid := c.Locals("uid").(uint)

View File

@@ -230,6 +230,34 @@ func FinishUploadingFile(uid uint, fid uint) (*model.FileView, error) {
return dbFile.ToView(), nil return dbFile.ToView(), nil
} }
func CancelUploadingFile(uid uint, fid uint) error {
uploadingFile, err := dao.GetUploadingFile(fid)
if err != nil {
log.Error("failed to get uploading file: ", err)
return model.NewNotFoundError("file not found")
}
if uploadingFile.UserID != uid {
return model.NewUnAuthorizedError("user cannot cancel uploading file")
}
if err := dao.DeleteUploadingFile(fid); err != nil {
log.Error("failed to delete uploading file: ", err)
return model.NewInternalServerError("failed to delete uploading file")
}
go func() {
// Wait for 1 second to ensure there is no block being uploading
time.Sleep(time.Second)
if err := os.RemoveAll(uploadingFile.TempPath); err != nil {
log.Error("failed to remove temp dir: ", err)
}
}()
updateUploadingSize(-uploadingFile.TotalSize)
return nil
}
func CreateRedirectFile(uid uint, filename string, description string, resourceID uint, redirectUrl string) (*model.FileView, error) { func CreateRedirectFile(uid uint, filename string, description string, resourceID uint, redirectUrl string) (*model.FileView, error) {
canUpload, err := checkUserCanUpload(uid) canUpload, err := checkUserCanUpload(uid)
if err != nil { if err != nil {