| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- package utils
- import (
- "encoding/base64"
- "errors"
- uuid "github.com/iris-contrib/go.uuid"
- "github.com/kataras/iris/v12"
- "io"
- "mime/multipart"
- "os"
- "path/filepath"
- "strings"
- "time"
- )
- // client version and secret, it should be from client side
- const (
- UploadDir string = "./public/upload/"
- UrlBase string = "/upload/"
- )
- // DstFile 文件
- type DstFile struct {
- Name string `json:"name"`
- Src string `json:"src"`
- }
- func UploadFile(ctx iris.Context) (*DstFile, error) {
- file, info, err := ctx.FormFile("uploadfile")
- if err != nil {
- return nil, err
- }
- defer file.Close()
- oldFileName := info.Filename
- destFile, url := GenerateNewFileName(oldFileName)
- out, err := os.OpenFile(destFile, os.O_WRONLY|os.O_CREATE, 0666)
- if err != nil {
- return nil, err
- }
- defer out.Close()
- _, err = io.Copy(out, file)
- if err != nil {
- return nil, err
- }
- outfile := &DstFile{Name: oldFileName, Src: url}
- return outfile, nil
- }
- func UploadFileBase64(ctx iris.Context) (*DstFile, error) {
- base64StrRaw := ctx.FormValue("base64")
- if base64StrRaw == "" && len(base64StrRaw) <= 8 {
- return nil, errors.New("文件错误")
- }
- index := strings.Index(base64StrRaw, ";")
- base64Str := base64StrRaw[index+8:]
- destByte, err := base64.StdEncoding.DecodeString(base64Str)
- if err != nil {
- return nil, err
- }
- suffix := base64StrRaw[11:index]
- oldFileName := "old." + suffix
- destFile, url := GenerateNewFileName(oldFileName)
- out, err := os.OpenFile(destFile, os.O_WRONLY|os.O_CREATE, 0666)
- if err != nil {
- return nil, err
- }
- defer out.Close()
- _, err = out.Write(destByte)
- if err != nil {
- return nil, err
- }
- outfile := &DstFile{Name: oldFileName, Src: url}
- return outfile, nil
- }
- // UploadMultiFiles Upload Multi Files
- func UploadMultiFiles(ctx iris.Context) (int, []DstFile, error) {
- maxSize := ctx.Application().ConfigurationReadOnly().GetPostMaxMemory()
- err := ctx.Request().ParseMultipartForm(maxSize)
- if err != nil {
- return 0, nil, err
- }
- form := ctx.Request().MultipartForm
- files := form.File["files[]"]
- count := len(files)
- failures := 0
- dstIndex := 1
- outFiles := []DstFile{}
- for _, file := range files {
- url, err := SaveUploadFile(file)
- if err != nil {
- failures++
- } else {
- out := DstFile{Name: file.Filename, Src: url}
- outFiles = append(outFiles, out)
- dstIndex++
- }
- }
- num := count - failures
- return num, outFiles, nil
- }
- func SaveUploadFile(fh *multipart.FileHeader) (string, error) {
- src, err := fh.Open()
- if err != nil {
- return "", err
- }
- defer src.Close()
- oldFileName := fh.Filename
- srcFile, urlFile := GenerateNewFileName(oldFileName)
- out, err := os.OpenFile(srcFile, os.O_WRONLY|os.O_CREATE, os.FileMode(0666))
- if err != nil {
- return "", err
- }
- defer out.Close()
- _, err = io.Copy(out, src)
- return urlFile, err
- }
- // BeforeSave Before Save
- func BeforeSave(ctx iris.Context, file *multipart.FileHeader) {
- ip := ctx.RemoteAddr()
- ip = strings.Replace(ip, ".", "-", -1)
- ip = strings.Replace(ip, ":", "-", -1)
- file.Filename = ip + "-" + file.Filename
- }
- // CreateDateDir Create date directory
- func CreateDateDir() (srcPath, urlPath string) {
- folderName := time.Now().Format("20060102")
- src := filepath.Join(UploadDir, folderName)
- url := filepath.Join(UrlBase, folderName)
- _, err := os.Stat(srcPath)
- if os.IsNotExist(err) {
- _ = os.Mkdir(src, os.ModePerm)
- _ = os.Chmod(src, os.ModePerm)
- }
- return src, url
- }
- // GenerateNewFileName Generate new file name
- func GenerateNewFileName(oldFileName string) (srcPath, urlPath string) {
- u1, _ := uuid.NewV4()
- newFileName := u1.String()
- src, url := CreateDateDir()
- dotIndex := strings.LastIndex(oldFileName, ".")
- if dotIndex != -1 && dotIndex != 0 {
- newFileName += oldFileName[dotIndex:]
- }
- src = filepath.Join(src, newFileName)
- url = filepath.Join(url, newFileName)
- return src, url
- }
|