upload.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //上传文件到网络服务器
  2. package spiderutil
  3. import (
  4. "bytes"
  5. "fmt"
  6. "io"
  7. "path"
  8. "qfw/util"
  9. weedcl "qfw/util/weedcl"
  10. "regexp"
  11. "strings"
  12. "time"
  13. "github.com/donnie4w/go-logger/logger"
  14. )
  15. var weedclClient *weedcl.Client
  16. 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)$")
  17. var commUsedReg = regexp.MustCompile("^(docx|gif|jpg|doc|pdf|rar|png|zip|gz|swf|xlsx|xls)$")
  18. var filterTypeReg = regexp.MustCompile("^(html|htm|xml|json)$")
  19. func InitWeedcl() {
  20. weedclClient = weedcl.NewClient(Config.FileServer)
  21. }
  22. func Upload(code, fileName, url string, bt []byte) (string, string, string) {
  23. if bt == nil || len(bt) == 0 {
  24. logger.Error("下载文件出错!", code, " upload file "+fileName, url)
  25. return "", "", ""
  26. }
  27. b := bytes.NewReader(bt)
  28. size := util.ConvertFileSize(b.Len())
  29. name, oldFileType := getNameAndType(fileName, url)
  30. newFileType := util.GetFileType(bt)
  31. //禁止上传
  32. if filterTypeReg.MatchString(newFileType) {
  33. fileName = name + "." + newFileType
  34. logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  35. return "", fileName, size
  36. }
  37. if oldFileType != "" {
  38. fileName = name + "." + oldFileType
  39. } else if newFileType != "" {
  40. fileName = name + "." + newFileType
  41. } else {
  42. fileName = name
  43. }
  44. fid, publicurl, err := weedclClient.UploadFromReader(fileName, io.MultiReader(b))
  45. if err != nil {
  46. logger.Error("上传文件出错!", code, " upload file "+fileName, url, err)
  47. return "", fileName, size
  48. }
  49. logger.Debug("上传文件成功!", code, url, "http://"+publicurl+"/"+fid, fileName, size)
  50. return "http://" + publicurl + "/" + fid, fileName, size
  51. }
  52. //返回下载链接,文件名称,文件大小,文件类型,文件fid
  53. func UploadFile(code, fileName, url string, bt []byte) (string, string, string, string, string) {
  54. if bt == nil || len(bt) < 1024*5 {
  55. logger.Error("下载文件出错!", code, " upload file "+fileName, url)
  56. return "", "", "", "", ""
  57. }
  58. bs := bytes.NewReader(bt)
  59. size := util.ConvertFileSize(bs.Len())
  60. name, oldFileType := getNameAndType(fileName, url)
  61. var newFileType string
  62. if path.Ext(fileName) == ".xls" {
  63. newFileType = "xls"
  64. } else {
  65. newFileType = util.GetFileType(bt)
  66. }
  67. //newFileType字节解析出来的文件类型不是常见类型时,替换成oldFileType
  68. if newFileType != oldFileType && !commUsedReg.MatchString(newFileType) && oldFileType != "" {
  69. newFileType = oldFileType
  70. }
  71. //禁止上传
  72. if filterTypeReg.MatchString(newFileType) {
  73. if oldFileType != "doc" && oldFileType != "docx" {
  74. fileName = name + "." + newFileType
  75. logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  76. return "", fileName, size, newFileType, ""
  77. } else {
  78. newFileType = oldFileType
  79. }
  80. }
  81. if oldFileType != "" {
  82. fileName = name + "." + oldFileType
  83. } else if newFileType != "" {
  84. fileName = name + "." + newFileType
  85. } else {
  86. fileName = name
  87. }
  88. key := getHashKey(bt) + TypeByExt(fileName)
  89. b, _ := OssPutObject(key, io.MultiReader(bs))
  90. if b {
  91. logger.Debug("上传文件成功!", code, url, key, fileName, size)
  92. return "oss", fileName, size, newFileType, key
  93. }
  94. return "", "", "", "", ""
  95. }
  96. //返回下载链接,文件名称,文件大小,文件类型,文件fid
  97. func UploadFile_back(code, fileName, url string, bt []byte) (string, string, string, string, string) {
  98. defer util.Catch()
  99. if bt == nil || len(bt) == 0 {
  100. logger.Error("下载文件出错!", code, " upload file "+fileName, url)
  101. return "", "", "", "", ""
  102. }
  103. b := bytes.NewReader(bt)
  104. size := util.ConvertFileSize(b.Len())
  105. name, oldFileType := getNameAndType(fileName, url)
  106. var newFileType string
  107. if path.Ext(fileName) == ".xls" {
  108. newFileType = "xls"
  109. } else {
  110. newFileType = util.GetFileType(bt)
  111. }
  112. //禁止上传
  113. if filterTypeReg.MatchString(newFileType) {
  114. fileName = name + "." + newFileType
  115. logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  116. return "", fileName, size, newFileType, ""
  117. }
  118. if oldFileType != "" {
  119. fileName = name + "." + oldFileType
  120. } else if newFileType != "" {
  121. fileName = name + "." + newFileType
  122. } else {
  123. fileName = name
  124. }
  125. fid, publicurl, err := weedclClient.UploadFromReader(fileName, io.MultiReader(b))
  126. if err != nil {
  127. logger.Error("上传文件出错!", code, " upload file "+fileName, url, err)
  128. return "", fileName, size, newFileType, ""
  129. }
  130. logger.Debug("上传文件成功!", code, url, "http://"+publicurl+"/"+fid, fileName, size)
  131. return "http://" + publicurl + "/" + fid, fileName, size, newFileType, fid
  132. }
  133. //获取文件名和文件类型,如果文件名中没有文件类型的话,
  134. //再去url里面找,都没有话的就返回空
  135. func getNameAndType(name, url string) (string, string) {
  136. //文件名中取
  137. fArray := strings.Split(name, ".")
  138. fName, fType := "", ""
  139. if len(fArray) > 1 {
  140. fType = fArray[len(fArray)-1]
  141. fName = strings.TrimRight(name, "."+fType)
  142. } else {
  143. fName = name
  144. }
  145. if fName != "" && fType != "" {
  146. return fName, fType
  147. }
  148. //url中取
  149. urlArray := strings.Split(url, "/")
  150. if len(urlArray) == 0 {
  151. return fName, fType
  152. }
  153. urlFileName := urlArray[len(urlArray)-1]
  154. if !strings.Contains(urlFileName, ".") {
  155. return fName, fType
  156. }
  157. uArray := strings.Split(urlFileName, ".")
  158. uName, uType := "", ""
  159. if len(uArray) > 1 {
  160. uType = uArray[len(uArray)-1]
  161. if fileTypeReg.MatchString(uType) {
  162. uName = strings.TrimRight(urlFileName, "."+uType)
  163. } else {
  164. uType = ""
  165. }
  166. }
  167. //
  168. if fName == "" && uName != "" {
  169. fName = uName
  170. } else if fName == "" && uName == "" {
  171. fName = fmt.Sprint(time.Now().Unix())
  172. }
  173. if fType == "" && uType != "" {
  174. fType = uType
  175. }
  176. return fName, fType
  177. }