142 lines
3.1 KiB
Go
142 lines
3.1 KiB
Go
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)
|
||
}
|
||
}
|