package ImRelateController import ( "bytes" "dsSzxy/Utils/CommonUtil" "dsSzxy/Utils/ConfigUtil" "dsSzxy/Utils/MinioUtil" "encoding/base64" "fmt" "github.com/disintegration/imaging" "github.com/gin-gonic/gin" "github.com/minio/minio-go/v6" "io/ioutil" "log" "net/http" "net/url" "os" "strings" ) //模块的路由配置 func Routers(r *gin.RouterGroup) { rr := r.Group("/imRelate") rr.POST("/fileUpload", fileUpload) } //聊天中的文件上传 func fileUpload(c *gin.Context) { file, err := c.FormFile("file") if err != nil { c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error())) return } //扩展名 ext := CommonUtil.Ext(file.Filename) ext = strings.ToLower(ext) //真实文件名 uuid := CommonUtil.GetUUID() //子目录 p := ConfigUtil.SavePath + uuid[0:2] exist := CommonUtil.Exists(p) if !exist { os.Mkdir(p, os.ModePerm) } trueName := uuid + ext filename := p + "/" + trueName if err := c.SaveUploadedFile(file, filename); err != nil { c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error())) return } //文件大小 content, err := ioutil.ReadFile(filename) if err == nil { fmt.Println("file size is ", len(content)) } size := len(content) // 初使化 minio client对象。 minioClient, err := MinioUtil.GetMinioClient() if err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "info": "minio无法连接!"}) return } // 使用FPutObject上传一个zip文件。 contentType := "application/octet-stream" _, err = minioClient.FPutObject(ConfigUtil.MinioBucket, trueName[0:2]+"/"+trueName, filename, minio.PutObjectOptions{ContentType: contentType}) if err != nil { log.Fatalln(err) } //返回 s := getFileDownLoadUrl(trueName[0:2]+"/"+trueName, file.Filename) originUrl := ConfigUtil.MinioDownloadPrefix + ConfigUtil.MinioBucket + "/" + trueName[0:2] + "/" + trueName //判断扩展名是不是图片 if ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp" { //读取本地文件 imgData, _ := ioutil.ReadFile(filename) buf := bytes.NewBuffer(imgData) image, err := imaging.Decode(buf) if err != nil { fmt.Println(err) return } //生成缩略图 image = imaging.Resize(image, 0, 150, imaging.Lanczos) thumbFileName := uuid + "_thumb" + ext thumbTrueName := p + "/" + thumbFileName err = imaging.Save(image, thumbTrueName) if err != nil { fmt.Println(err) } //读入生成图片的base64编码 ff, _ := os.Open(thumbTrueName) defer ff.Close() sourceBuffer := make([]byte, 500000) n, _ := ff.Read(sourceBuffer) //base64压缩 sourceString := base64.StdEncoding.EncodeToString(sourceBuffer[:n]) //删除原始文件 os.Remove(filename) //删除缩略图文件 os.Remove(thumbTrueName) c.JSON(200, gin.H{ "success": true, "originUrl": originUrl, "url": s, "thumbContent": sourceString, "size": size, }) } else { //删除原始文件 os.Remove(filename) c.JSON(200, gin.H{ "success": true, "url": s, "size": size, }) } } /** 功能:生成下载地址带中文名 */ func getFileDownLoadUrl(key string, originName string) string { infix := "?response-content-disposition=attachment%3BfileName%2A%3DUTF-8%27%27" downloadUrl := ConfigUtil.MinioDownloadPrefix + ConfigUtil.MinioBucket + "/" + key + infix + url.QueryEscape(url.QueryEscape(originName)) return downloadUrl }