upload.go 6.4 KB

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