mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2024-11-11 18:05:59 +08:00
111 lines
2.9 KiB
Go
111 lines
2.9 KiB
Go
|
package v1
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper"
|
||
|
"github.com/1Panel-dev/1Panel/backend/constant"
|
||
|
"github.com/1Panel-dev/1Panel/backend/global"
|
||
|
"github.com/1Panel-dev/1Panel/backend/utils/files"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
func mergeChunks(fileName string, fileDir string, dstDir string, chunkCount int) error {
|
||
|
//fileInfoList, err := ioutil.ReadDir(fileDir)
|
||
|
//if err != nil {
|
||
|
// return err
|
||
|
//}
|
||
|
|
||
|
targetFile, err := os.Create(filepath.Join(dstDir, fileName))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer targetFile.Close()
|
||
|
|
||
|
for i := 0; i < chunkCount; i++ {
|
||
|
chunkPath := filepath.Join(fileDir, fmt.Sprintf("%s.%d", fileName, i))
|
||
|
chunkData, err := ioutil.ReadFile(chunkPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
_, err = targetFile.Write(chunkData)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return files.NewFileOp().DeleteDir(fileDir)
|
||
|
}
|
||
|
|
||
|
func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
|
||
|
fileForm, err := c.FormFile("chunk")
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
uploadFile, err := fileForm.Open()
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
chunkIndex, err := strconv.Atoi(c.PostForm("chunkIndex"))
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
chunkCount, err := strconv.Atoi(c.PostForm("chunkCount"))
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
fileOp := files.NewFileOp()
|
||
|
if err := fileOp.CreateDir("uploads", 0755); err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
//fileID := uuid.New().String()
|
||
|
filename := c.PostForm("filename")
|
||
|
fileDir := filepath.Join(global.CONF.System.DataDir, "upload", filename)
|
||
|
|
||
|
os.MkdirAll(fileDir, 0755)
|
||
|
filePath := filepath.Join(fileDir, filename)
|
||
|
|
||
|
emptyFile, err := os.Create(filePath)
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
emptyFile.Close()
|
||
|
|
||
|
chunkData, err := ioutil.ReadAll(uploadFile)
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
chunkPath := filepath.Join(fileDir, fmt.Sprintf("%s.%d", filename, chunkIndex))
|
||
|
err = ioutil.WriteFile(chunkPath, chunkData, 0644)
|
||
|
if err != nil {
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if chunkIndex+1 == chunkCount {
|
||
|
err = mergeChunks(filename, fileDir, c.PostForm("path"), chunkCount)
|
||
|
if err != nil {
|
||
|
fmt.Println(err.Error())
|
||
|
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrAppDelete, err)
|
||
|
return
|
||
|
}
|
||
|
helper.SuccessWithData(c, true)
|
||
|
} else {
|
||
|
return
|
||
|
}
|
||
|
}
|