bilibili-backup/app/admin/main/growup/http/upload.go
2019-04-22 02:59:20 +00:00

142 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package http
import (
"io/ioutil"
"mime/multipart"
"net/http"
"path"
"strings"
"time"
"bytes"
"crypto/md5"
"fmt"
"go-common/app/admin/main/growup/conf"
"go-common/app/admin/main/growup/dao"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/render"
"io"
"os"
)
// upload
func upload(c *bm.Context) {
var (
fileTpye string
file multipart.File
header *multipart.FileHeader
fileName string
body []byte
location string
err error
)
if file, header, err = c.Request.FormFile("file"); err != nil {
c.JSON(nil, ecode.RequestErr)
log.Error("c.Request().FormFile(\"file\") error(%v)", err)
return
}
defer file.Close()
fileName = header.Filename
fileTpye = strings.TrimPrefix(path.Ext(fileName), ".")
if body, err = ioutil.ReadAll(file); err != nil {
c.JSON(nil, ecode.RequestErr)
log.Error("ioutil.ReadAll(c.Request().Body) error(%v)", err)
return
}
if location, err = svr.Upload(c, "", fileTpye, time.Now(), body); err != nil {
c.JSON(nil, err)
return
}
c.Render(http.StatusOK, render.MapJSON(map[string]interface{}{
"code": 0,
"message": "0",
"data": struct {
URL string `json:"url"`
}{
location,
},
}))
}
const (
uploadFilePath = "/data/uploadfiles/"
)
type localUploadResult struct {
FileName string `json:"filename"`
}
type uploadResult struct {
localUploadResult
MemberCount int64 `json:"member_count"`
}
// upload
func uploadLocal(c *bm.Context) {
var (
file multipart.File
header *multipart.FileHeader
result uploadResult
err error
)
switch {
default:
if file, header, err = c.Request.FormFile("file"); err != nil {
log.Error("c.Request().FormFile(\"file\") error(%v)", err)
break
}
if header.Size >= int64(conf.Conf.Bfs.MaxFileSize) {
log.Error("file is too big, filesize=%d, expected<=%d", conf.Conf.Bfs.MaxFileSize, header.Size)
err = fmt.Errorf("文件过大,需要小于%dkb", conf.Conf.Bfs.MaxFileSize/1024)
break
}
var ext = path.Ext(header.Filename)
if ext != ".csv" && ext != ".txt" {
log.Error("only csv or txt supported")
err = fmt.Errorf("只支持csv或txt格式文件以逗号或换行分隔")
break
}
defer file.Close()
// 创建保存文件
if _, e := os.Stat(uploadFilePath); os.IsNotExist(e) {
os.MkdirAll(uploadFilePath, 0777)
}
var h = md5.New()
h.Write([]byte(header.Filename))
var filenameMd5 = fmt.Sprintf("%x", h.Sum(nil))
var desfilename = filenameMd5 + ext
var destFile *os.File
destFile, err = os.Create(uploadFilePath + desfilename)
if err != nil {
log.Error("Create failed: %s\n", err)
break
}
defer destFile.Close()
var membuf = bytes.NewBuffer(nil)
_, err = io.Copy(membuf, file)
if err != nil {
log.Error("err copy file, err=%s", err)
break
}
var midList = dao.ParseMidsFromString(membuf.String())
result.MemberCount = int64(len(midList))
_, err = destFile.Write(membuf.Bytes())
if err != nil {
log.Error("write file error, err=%s", err)
break
}
result.FileName = desfilename
}
if err != nil {
bmHTTPErrorWithMsg(c, err, err.Error())
} else {
c.JSON(&result, err)
}
}