local_upload.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package utils
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. uuid "github.com/iris-contrib/go.uuid"
  6. "github.com/kataras/iris/v12"
  7. "io"
  8. "mime/multipart"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "time"
  13. )
  14. // client version and secret, it should be from client side
  15. const (
  16. UploadDir string = "./public/upload/"
  17. UrlBase string = "/upload/"
  18. )
  19. // DstFile 文件
  20. type DstFile struct {
  21. Name string `json:"name"`
  22. Src string `json:"src"`
  23. }
  24. func UploadFile(ctx iris.Context) (*DstFile,error){
  25. file ,info ,err := ctx.FormFile("uploadfile")
  26. if err != nil {
  27. return nil ,err
  28. }
  29. defer file.Close()
  30. oldFileName := info.Filename
  31. destFile, url := GenerateNewFileName(oldFileName)
  32. out, err := os.OpenFile(destFile, os.O_WRONLY|os.O_CREATE, 0666)
  33. if err != nil{
  34. return nil, err
  35. }
  36. defer out.Close()
  37. _ ,err = io.Copy(out, file)
  38. if err != nil {
  39. return nil, err
  40. }
  41. outfile := &DstFile{Name: oldFileName ,Src:url }
  42. return outfile, nil
  43. }
  44. func UploadFileBase64(ctx iris.Context) (*DstFile,error){
  45. base64StrRaw := ctx.FormValue("base64")
  46. if base64StrRaw == "" && len(base64StrRaw) <= 8 {
  47. return nil, errors.New("文件错误")
  48. }
  49. index := strings.Index(base64StrRaw, ";")
  50. base64Str := base64StrRaw[index+8:]
  51. destByte, err := base64.StdEncoding.DecodeString(base64Str)
  52. if err != nil {
  53. return nil, err
  54. }
  55. suffix := base64StrRaw[11:index]
  56. oldFileName := "old."+suffix
  57. destFile, url := GenerateNewFileName(oldFileName)
  58. out, err := os.OpenFile(destFile, os.O_WRONLY|os.O_CREATE, 0666)
  59. if err != nil{
  60. return nil, err
  61. }
  62. defer out.Close()
  63. _ ,err = out.Write(destByte)
  64. if err != nil {
  65. return nil, err
  66. }
  67. outfile := &DstFile{Name: oldFileName ,Src:url }
  68. return outfile, nil
  69. }
  70. // UploadMultiFiles Upload Multi Files
  71. func UploadMultiFiles(ctx iris.Context)(int, []DstFile, error){
  72. maxSize := ctx.Application().ConfigurationReadOnly().GetPostMaxMemory()
  73. err := ctx.Request().ParseMultipartForm(maxSize)
  74. if err != nil {
  75. return 0 , nil, err
  76. }
  77. form := ctx.Request().MultipartForm
  78. files := form.File["files[]"]
  79. count := len(files)
  80. failures := 0
  81. dstIndex := 1
  82. outFiles := []DstFile{}
  83. for _, file := range files {
  84. url, err := SaveUploadFile(file)
  85. if err != nil {
  86. failures++
  87. }else{
  88. out := DstFile{Name: file.Filename ,Src:url}
  89. outFiles = append(outFiles, out)
  90. dstIndex++
  91. }
  92. }
  93. num := count - failures
  94. return num ,outFiles ,nil
  95. }
  96. func SaveUploadFile(fh *multipart.FileHeader)(string, error){
  97. src ,err := fh.Open()
  98. if err != nil {
  99. return "" ,err
  100. }
  101. defer src.Close()
  102. oldFileName := fh.Filename
  103. srcFile, urlFile := GenerateNewFileName(oldFileName)
  104. out, err := os.OpenFile(srcFile ,os.O_WRONLY|os.O_CREATE ,os.FileMode(0666))
  105. if err != nil {
  106. return "" ,err
  107. }
  108. defer out.Close()
  109. _, err = io.Copy(out, src)
  110. return urlFile, err
  111. }
  112. // BeforeSave Before Save
  113. func BeforeSave(ctx iris.Context ,file *multipart.FileHeader){
  114. ip := ctx.RemoteAddr()
  115. ip = strings.Replace(ip ,"." ,"-" ,-1)
  116. ip = strings.Replace(ip ,":" ,"-" ,-1)
  117. file.Filename = ip + "-" + file.Filename
  118. }
  119. // CreateDateDir Create date directory
  120. func CreateDateDir() (srcPath, urlPath string) {
  121. folderName := time.Now().Format("20060102")
  122. src := filepath.Join(UploadDir, folderName)
  123. url := filepath.Join(UrlBase, folderName)
  124. _, err := os.Stat(srcPath)
  125. if os.IsNotExist(err ){
  126. _ = os.Mkdir(src, os.ModePerm)
  127. _ = os.Chmod(src, os.ModePerm)
  128. }
  129. return src ,url
  130. }
  131. // GenerateNewFileName Generate new file name
  132. func GenerateNewFileName(oldFileName string) (srcPath, urlPath string) {
  133. u1, _ := uuid.NewV4()
  134. newFileName := u1.String()
  135. src , url := CreateDateDir()
  136. dotIndex := strings.LastIndex(oldFileName, ".")
  137. if dotIndex != -1 && dotIndex != 0 {
  138. newFileName += oldFileName[dotIndex:]
  139. }
  140. src = filepath.Join(src, newFileName)
  141. url = filepath.Join(url, newFileName)
  142. return src, url
  143. }