1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package http
- import (
- "fmt"
- "io/ioutil"
- "path/filepath"
- "go-common/app/service/main/account-recovery/model"
- "go-common/library/database/bfs"
- "go-common/library/ecode"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "github.com/google/uuid"
- "github.com/pkg/errors"
- )
- var _allowedExt = map[string]struct{}{
- ".zip": {},
- ".rar": {},
- ".7z": {},
- }
- func fileUpload(c *bm.Context) {
- defer c.Request.Form.Del("file") // 防止日志不出现
- c.Request.ParseMultipartForm(32 << 20)
- recoveryFile, fileName, err := func() ([]byte, string, error) {
- f, fh, err := c.Request.FormFile("file")
- if err != nil {
- return nil, "", errors.Wrapf(err, "parse file form file: ")
- }
- defer f.Close()
- data, err := ioutil.ReadAll(f)
- if err != nil {
- return nil, "", errors.Wrapf(err, "read file form file:")
- }
- if len(data) <= 0 {
- return nil, "", errors.Wrapf(err, "form file data: length: %d", len(data))
- }
- log.Info("Succeeded to parse file from form file: length: %d", len(data))
- return data, fh.Filename, nil
- }()
- if err != nil {
- log.Error("Failed to parse file file: %+v", err)
- c.JSON(nil, ecode.RequestErr)
- return
- }
- log.Info("Succeeded to parse recoveryFile data: recoveryFile-length: %d", len(recoveryFile))
- //限制文件大小
- if len(recoveryFile) > 10*1024*1024 {
- log.Error("account-recovery: file is to large(%v)", len(recoveryFile))
- c.JSON(nil, ecode.FileTooLarge)
- return
- }
- //限制文件类型 *.zip, *.rar, *.7z
- ext := filepath.Ext(fileName)
- _, allowed := _allowedExt[ext]
- if !allowed {
- c.JSON(nil, ecode.BfsUploadFileContentTypeIllegal)
- return
- }
- request := &bfs.Request{
- Bucket: "account",
- Dir: "recovery",
- File: recoveryFile,
- Filename: fmt.Sprintf("%s%s", uuid4(), ext),
- }
- bfsClient := bfs.New(nil)
- location, err := bfsClient.Upload(c, request)
- if err != nil {
- log.Error("err(%+v)", err)
- c.JSON(nil, err)
- return
- }
- fileURL := model.BuildFileURL(location)
- data := map[string]interface{}{
- "url": location,
- "fileURL": fileURL,
- }
- c.JSON(data, nil)
- }
- func uuid4() string {
- return uuid.New().String()
- }
|