upload.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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("^(xlsx|xls|bmp|mdb|docx|gif|avi|chm|dbx|jpg|jpeg|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|jpeg|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*3 {
  55. logger.Error("下载文件出错!", code, len(bt), " 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. fileName = name
  68. if !commUsedReg.MatchString(newFileType) { //newFileType不是常见类型
  69. if !commUsedReg.MatchString(oldFileType) { //都不是常见的附件类型不上传
  70. logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  71. return "", fileName, size, newFileType, ""
  72. } else {
  73. newFileType = oldFileType
  74. fileName = name + "." + newFileType
  75. }
  76. } else { //newFileType是常见类型
  77. fileName = name + "." + newFileType
  78. if commUsedReg.MatchString(oldFileType) && newFileType != oldFileType {
  79. logger.Info("附件类型不同:", newFileType, oldFileType, code, url)
  80. newFileType = oldFileType
  81. fileName = name + "." + newFileType
  82. }
  83. }
  84. //newFileType字节解析出来的文件类型不是常见类型时,替换成oldFileType
  85. // if newFileType != oldFileType && !commUsedReg.MatchString(newFileType) && oldFileType != "" {
  86. // newFileType = oldFileType
  87. // }
  88. //禁止上传
  89. // if filterTypeReg.MatchString(newFileType) {
  90. // if oldFileType != "doc" && oldFileType != "docx" {
  91. // fileName = name + "." + newFileType
  92. // logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  93. // return "", fileName, size, newFileType, ""
  94. // } else {
  95. // newFileType = oldFileType
  96. // }
  97. // }
  98. // if oldFileType != "" {
  99. // fileName = name + "." + oldFileType
  100. // } else if newFileType != "" {
  101. // fileName = name + "." + newFileType
  102. // } else {
  103. // fileName = name
  104. // }
  105. key := GetHashKey(bt) + TypeByExt(fileName)
  106. b, _ := OssPutObject(key, io.MultiReader(bs))
  107. if b {
  108. logger.Debug("上传文件成功!", code, " ", url, " ", key, " ", fileName, size)
  109. return "oss", fileName, size, newFileType, key
  110. }
  111. return "", "", "", "", ""
  112. }
  113. //返回下载链接,文件名称,文件大小,文件类型,文件fid
  114. func UploadFile_back(code, fileName, url string, bt []byte) (string, string, string, string, string) {
  115. defer util.Catch()
  116. if bt == nil || len(bt) == 0 {
  117. logger.Error("下载文件出错!", code, " upload file "+fileName, url)
  118. return "", "", "", "", ""
  119. }
  120. b := bytes.NewReader(bt)
  121. size := util.ConvertFileSize(b.Len())
  122. name, oldFileType := getNameAndType(fileName, url)
  123. var newFileType string
  124. if path.Ext(fileName) == ".xls" {
  125. newFileType = "xls"
  126. } else {
  127. newFileType = util.GetFileType(bt)
  128. }
  129. //禁止上传
  130. if filterTypeReg.MatchString(newFileType) {
  131. fileName = name + "." + newFileType
  132. logger.Error("上传文件出错,该文件类型禁止上传!", code, " upload file "+fileName, url)
  133. return "", fileName, size, newFileType, ""
  134. }
  135. if oldFileType != "" {
  136. fileName = name + "." + oldFileType
  137. } else if newFileType != "" {
  138. fileName = name + "." + newFileType
  139. } else {
  140. fileName = name
  141. }
  142. fid, publicurl, err := weedclClient.UploadFromReader(fileName, io.MultiReader(b))
  143. if err != nil {
  144. logger.Error("上传文件出错!", code, " upload file "+fileName, url, err)
  145. return "", fileName, size, newFileType, ""
  146. }
  147. logger.Debug("上传文件成功!", code, url, "http://"+publicurl+"/"+fid, fileName, size)
  148. return "http://" + publicurl + "/" + fid, fileName, size, newFileType, fid
  149. }
  150. //获取文件名和文件类型,如果文件名中没有文件类型的话,
  151. //再去url里面找,都没有话的就返回空
  152. func getNameAndType(name, url string) (string, string) {
  153. //文件名中取
  154. fArray := strings.Split(name, ".")
  155. fName, fType := "", ""
  156. if len(fArray) > 1 {
  157. fType = fArray[len(fArray)-1]
  158. fName = strings.TrimRight(name, "."+fType)
  159. } else {
  160. fName = name
  161. }
  162. if fName != "" && fType != "" {
  163. return fName, fType
  164. }
  165. //url中取
  166. urlArray := strings.Split(url, "/")
  167. if len(urlArray) == 0 {
  168. return fName, fType
  169. }
  170. urlFileName := urlArray[len(urlArray)-1]
  171. if !strings.Contains(urlFileName, ".") {
  172. return fName, fType
  173. }
  174. uArray := strings.Split(urlFileName, ".")
  175. uName, uType := "", ""
  176. if len(uArray) > 1 {
  177. uType = uArray[len(uArray)-1]
  178. if fileTypeReg.MatchString(uType) {
  179. uName = strings.TrimRight(urlFileName, "."+uType)
  180. } else {
  181. uType = ""
  182. }
  183. }
  184. //
  185. if fName == "" && uName != "" {
  186. fName = uName
  187. } else if fName == "" && uName == "" {
  188. fName = fmt.Sprint(time.Now().Unix())
  189. }
  190. if fType == "" && uType != "" {
  191. fType = uType
  192. }
  193. return fName, fType
  194. }