123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- //上传文件到网络服务器
- package spiderutil
- import (
- "bytes"
- "fmt"
- "io"
- "path"
- "qfw/util"
- weedcl "qfw/util/weedcl"
- "regexp"
- "strings"
- "time"
- "github.com/donnie4w/go-logger/logger"
- )
- var weedclClient *weedcl.Client
- var fileTypeReg = regexp.MustCompile("^(bmp|mdb|docx|gif|avi|chm|dbx|jpg|mp4|bat|bmp|psd|eml|rtf|mpg|ini|wpd|pwl|flv|doc|pdf|wmv|mid|mxp|qdf|ps|mp3|wav|sql|rar|torrent|png|bmp|jar|pst|css|xml|rmvb|tif|dwg|zip|mov|mf|properties|js|gz|ram|exe)$")
- var commUsedReg = regexp.MustCompile("^(docx|gif|jpg|doc|pdf|rar|png|zip|gz|swf|xlsx|xls)$")
- var filterTypeReg = regexp.MustCompile("^(html|htm|xml|json)$")
- func InitWeedcl() {
- weedclClient = weedcl.NewClient(Config.FileServer)
- }
- func Upload(code, fileName, url string, bt []byte) (string, string, string) {
- if bt == nil || len(bt) == 0 {
- logger.Error("下载文件出错!", code, " upload file "+fileName, url)
- return "", "", ""
- }
- b := bytes.NewReader(bt)
- size := util.ConvertFileSize(b.Len())
- name, oldFileType := getNameAndType(fileName, url)
- newFileType := util.GetFileType(bt)
- //禁止上传
- if filterTypeReg.MatchString(newFileType) {
- fileName = name + "." + newFileType
- logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
- return "", fileName, size
- }
- if oldFileType != "" {
- fileName = name + "." + oldFileType
- } else if newFileType != "" {
- fileName = name + "." + newFileType
- } else {
- fileName = name
- }
- fid, publicurl, err := weedclClient.UploadFromReader(fileName, io.MultiReader(b))
- if err != nil {
- logger.Error("上传文件出错!", code, " upload file "+fileName, url, err)
- return "", fileName, size
- }
- logger.Debug("上传文件成功!", code, url, "http://"+publicurl+"/"+fid, fileName, size)
- return "http://" + publicurl + "/" + fid, fileName, size
- }
- //返回下载链接,文件名称,文件大小,文件类型,文件fid
- func UploadFile(code, fileName, url string, bt []byte) (string, string, string, string, string) {
- if bt == nil || len(bt) < 1024*5 {
- logger.Error("下载文件出错!", code, " upload file "+fileName, url)
- return "", "", "", "", ""
- }
- bs := bytes.NewReader(bt)
- size := util.ConvertFileSize(bs.Len())
- name, oldFileType := getNameAndType(fileName, url)
- var newFileType string
- if path.Ext(fileName) == ".xls" {
- newFileType = "xls"
- } else {
- newFileType = util.GetFileType(bt)
- }
- //newFileType字节解析出来的文件类型不是常见类型时,替换成oldFileType
- if newFileType != oldFileType && !commUsedReg.MatchString(newFileType) && oldFileType != "" {
- newFileType = oldFileType
- }
- //禁止上传
- if filterTypeReg.MatchString(newFileType) {
- if oldFileType != "doc" && oldFileType != "docx" {
- fileName = name + "." + newFileType
- logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
- return "", fileName, size, newFileType, ""
- } else {
- newFileType = oldFileType
- }
- }
- if oldFileType != "" {
- fileName = name + "." + oldFileType
- } else if newFileType != "" {
- fileName = name + "." + newFileType
- } else {
- fileName = name
- }
- key := getHashKey(bt) + TypeByExt(fileName)
- b, _ := OssPutObject(key, io.MultiReader(bs))
- if b {
- logger.Debug("上传文件成功!", code, url, key, fileName, size)
- return "oss", fileName, size, newFileType, key
- }
- return "", "", "", "", ""
- }
- //返回下载链接,文件名称,文件大小,文件类型,文件fid
- func UploadFile_back(code, fileName, url string, bt []byte) (string, string, string, string, string) {
- defer util.Catch()
- if bt == nil || len(bt) == 0 {
- logger.Error("下载文件出错!", code, " upload file "+fileName, url)
- return "", "", "", "", ""
- }
- b := bytes.NewReader(bt)
- size := util.ConvertFileSize(b.Len())
- name, oldFileType := getNameAndType(fileName, url)
- var newFileType string
- if path.Ext(fileName) == ".xls" {
- newFileType = "xls"
- } else {
- newFileType = util.GetFileType(bt)
- }
- //禁止上传
- if filterTypeReg.MatchString(newFileType) {
- fileName = name + "." + newFileType
- logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
- return "", fileName, size, newFileType, ""
- }
- if oldFileType != "" {
- fileName = name + "." + oldFileType
- } else if newFileType != "" {
- fileName = name + "." + newFileType
- } else {
- fileName = name
- }
- fid, publicurl, err := weedclClient.UploadFromReader(fileName, io.MultiReader(b))
- if err != nil {
- logger.Error("上传文件出错!", code, " upload file "+fileName, url, err)
- return "", fileName, size, newFileType, ""
- }
- logger.Debug("上传文件成功!", code, url, "http://"+publicurl+"/"+fid, fileName, size)
- return "http://" + publicurl + "/" + fid, fileName, size, newFileType, fid
- }
- //获取文件名和文件类型,如果文件名中没有文件类型的话,
- //再去url里面找,都没有话的就返回空
- func getNameAndType(name, url string) (string, string) {
- //文件名中取
- fArray := strings.Split(name, ".")
- fName, fType := "", ""
- if len(fArray) > 1 {
- fType = fArray[len(fArray)-1]
- fName = strings.TrimRight(name, "."+fType)
- } else {
- fName = name
- }
- if fName != "" && fType != "" {
- return fName, fType
- }
- //url中取
- urlArray := strings.Split(url, "/")
- if len(urlArray) == 0 {
- return fName, fType
- }
- urlFileName := urlArray[len(urlArray)-1]
- if !strings.Contains(urlFileName, ".") {
- return fName, fType
- }
- uArray := strings.Split(urlFileName, ".")
- uName, uType := "", ""
- if len(uArray) > 1 {
- uType = uArray[len(uArray)-1]
- if fileTypeReg.MatchString(uType) {
- uName = strings.TrimRight(urlFileName, "."+uType)
- } else {
- uType = ""
- }
- }
- //
- if fName == "" && uName != "" {
- fName = uName
- } else if fName == "" && uName == "" {
- fName = fmt.Sprint(time.Now().Unix())
- }
- if fType == "" && uType != "" {
- fType = uType
- }
- return fName, fType
- }
|