From 2b97882b4223b24e7245217105e177eace1b762d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=87=89?= <927625802@qq.com> Date: Sat, 8 Jan 2022 21:29:00 +0800 Subject: [PATCH] :sparkler: Multiple file upload --- drivers/operate/operate.go | 3 +++ server/controllers/file.go | 46 +++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/drivers/operate/operate.go b/drivers/operate/operate.go index 0c34582d..07e57eb7 100644 --- a/drivers/operate/operate.go +++ b/drivers/operate/operate.go @@ -51,6 +51,9 @@ func Delete(driver base.Driver, account *model.Account, path string, clearCache } func Upload(driver base.Driver, account *model.Account, file *model.FileStream, clearCache bool) error { + defer func() { + _ = file.Close() + }() err := driver.Upload(file, account) if err == nil && clearCache { _ = base.DeleteCache(file.ParentPath, account) diff --git a/server/controllers/file.go b/server/controllers/file.go index 39380834..dbb08fce 100644 --- a/server/controllers/file.go +++ b/server/controllers/file.go @@ -3,6 +3,7 @@ package controllers import ( "errors" "github.com/Xhofe/alist/conf" + "github.com/Xhofe/alist/drivers/base" "github.com/Xhofe/alist/drivers/operate" "github.com/Xhofe/alist/model" "github.com/Xhofe/alist/server/common" @@ -26,33 +27,38 @@ func UploadFile(c *gin.Context) { return } } - file, err := c.FormFile("file") - if err != nil { - common.ErrorResp(c, err, 400) - } - open, err := file.Open() - defer func() { - _ = open.Close() - }() - if err != nil { - return - } account, path_, driver, err := common.ParsePath(path) if err != nil { common.ErrorResp(c, err, 500) return } - fileStream := model.FileStream{ - File: open, - Size: uint64(file.Size), - ParentPath: path_, - Name: file.Filename, - MIMEType: file.Header.Get("Content-Type"), - } - err = operate.Upload(driver, account, &fileStream, true) + form, err := c.MultipartForm() + if err != nil { + common.ErrorResp(c, err, 400) + } + files := form.File["files"] if err != nil { - common.ErrorResp(c, err, 500) return } + for i, file := range files { + open, err := file.Open() + fileStream := model.FileStream{ + File: open, + Size: uint64(file.Size), + ParentPath: path_, + Name: file.Filename, + MIMEType: file.Header.Get("Content-Type"), + } + clearCache := false + if i == len(files)-1 { + clearCache = true + } + err = operate.Upload(driver, account, &fileStream, clearCache) + if err != nil { + _ = base.DeleteCache(path_, account) + common.ErrorResp(c, err, 500) + return + } + } common.SuccessResp(c) }