You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
6.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package MinIORelateController
import (
"dsSzxy/Business/MinIORelate/MinIORelateDao"
"dsSzxy/Utils/CommonUtil"
"dsSzxy/Utils/ConfigUtil"
"dsSzxy/Utils/MinioUtil"
"dsSzxy/Utils/ObsUtil"
"dsSzxy/Utils/ObsUtil/obs"
"dsSzxy/Utils/RedisUtil"
"fmt"
"github.com/gin-gonic/gin"
"github.com/minio/minio-go/v6"
"net/http"
"net/url"
"path"
"strings"
"time"
)
//模块的路由配置1
func Routers(r *gin.RouterGroup) {
rr := r.Group("/minioRelate")
rr.GET("/getPostPolicyInfo", getPostPolicyInfo)
rr.GET("/generatePreviewUrl", generatePreviewUrl)
rr.GET("/saveFileInfo", saveFileInfo)
rr.GET("/getFileDownLoadUrl", getFileDownLoadUrl)
}
/**
功能根据ID获取文件的下载地址和原始文件名
*/
func getFileDownLoadUrl(c *gin.Context) {
id := c.Query("id")
if id == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "文件id参数不允许为空"})
return
}
resMap, err := MinIORelateDao.GetDownLoadUrl(id)
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "获取文件信息失败!"})
return
}
if len(resMap) == 0 {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "未查询到文件信息!"})
return
}
originName := resMap["origin_name"]
storageKey := resMap["storage_key"]
storageBucket := resMap["storage_bucket"]
infix := "?response-content-disposition=attachment%3BfileName%2A%3DUTF-8%27%27"
downloadUrl := ConfigUtil.MinioDownloadPrefix + storageBucket + "/" + storageKey + infix + url.QueryEscape(url.QueryEscape(originName))
c.JSON(http.StatusOK, gin.H{"success": true, "download_url": downloadUrl})
}
/**
功能:前台直传文件成功后,保存上传文件相间信息
作者:吴缤
日期2021-07-06
*/
func saveFileInfo(c *gin.Context) {
id := c.Query("id")
if id == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "文件id参数不允许为空"})
return
}
systemId := c.Query("systemid")
if systemId == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "系统ID不允许为空"})
return
}
redisFileMap := RedisUtil.HMGETALL("file_" + id)
if len(redisFileMap) == 0 {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "文件id不存在"})
return
}
fileKey := redisFileMap["key"]
fileOriginName := redisFileMap["origin_name"]
fileUrlPrefix := redisFileMap["url"]
fileBucket := redisFileMap["bucket"]
minioClient, err := MinioUtil.GetMinioClient()
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "minio无法连接"})
return
}
//获取文件信息
objInfo, objErr := minioClient.StatObject(fileBucket, fileKey, minio.StatObjectOptions{})
if objErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "在存储中未找到文件!"})
return
}
fileSize := CommonUtil.ConvertInt64ToString(objInfo.Size)
fileMd5 := objInfo.ETag
fileMap := make(map[string]string)
fileMap["id"] = id
fileMap["origin_name"] = fileOriginName
fileMap["storage_key"] = fileKey
fileMap["storage_bucket"] = fileBucket
fileMap["storage_url_prefix"] = fileUrlPrefix
fileMap["file_size"] = fileSize
fileMap["file_md5"] = fileMd5
fileMap["system_id"] = systemId
insertErr := MinIORelateDao.InsertFileInfo(fileMap)
if insertErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "写入数据库失败!"})
return
}
//删除redis中的信息
RedisUtil.DEL("file_" + id)
c.JSON(http.StatusOK, gin.H{"success": true, "info": "成功!"})
}
/**
功能:生成预览地址
作者:吴缤
日期2021-07-05
*/
func generatePreviewUrl(c *gin.Context) {
id := c.Query("id")
if id == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "id参数不允许为空"})
return
}
//根据ID获取数据库中该文件的key
key, err := MinIORelateDao.GetFileKey(id)
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "获取存储中的key异常" + err.Error()})
return
}
obsClient, obsClientErr := ObsUtil.GetObsClient()
if obsClientErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "获取OBS客户端异常" + obsClientErr.Error()})
return
}
MetadataInput := &obs.GetObjectMetadataInput{}
MetadataInput.Bucket = ConfigUtil.ObsBucket
MetadataInput.Key = "crh/" + key
_, metadataErr := obsClient.GetObjectMetadata(MetadataInput)
//metadataErr不等于nil说明OBS上没有文件需要上传
if metadataErr != nil {
minioClient, minioClientErr := MinioUtil.GetMinioClient()
if minioClientErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "获取MinIO客户端异常" + minioClientErr.Error()})
return
}
//获取minio中的文件流
minioObject, getObjErr := minioClient.GetObject(ConfigUtil.MinioBucket, key, minio.GetObjectOptions{})
if getObjErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "获取文件信息异常!" + getObjErr.Error()})
return
}
input := &obs.PutObjectInput{}
input.Bucket = ConfigUtil.ObsBucket
input.Key = "crh/" + key
input.Body = minioObject
_, putObjErr := obsClient.PutObject(input)
if putObjErr != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "文件上传至OBS异常" + putObjErr.Error()})
return
}
}
obsClient.Close()
c.JSON(http.StatusOK, gin.H{"success": true, "url": ConfigUtil.PreviewPrefix + key})
}
/**
功能:获取前台上传时所需要相关信息
作者:吴缤
日期2021-07-05
*/
func getPostPolicyInfo(c *gin.Context) {
fileName := c.Query("filename")
if fileName == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "文件名称不允许为空!"})
return
}
extension := path.Ext(fileName)
minioClient, err := MinioUtil.GetMinioClient()
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "minio无法连接"})
return
}
//生成一个文件名
id := CommonUtil.GetUUID()
policy := minio.NewPostPolicy()
//Bucket名称
policy.SetBucket(ConfigUtil.MinioBucket)
policy.SetKey(id[0:2] + "/" + id + extension)
//1天有效期
policy.SetExpires(time.Now().UTC().AddDate(0, 0, 1))
url, formData, err := minioClient.PresignedPostPolicy(policy)
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "info": "minio生成签名失败"})
return
}
policyMap := make(map[string]interface{})
for k, v := range formData {
policyMap[strings.Replace(k, "-", "_", -1)] = v
}
policyMap["url"] = fmt.Sprintf("%s", url)
policyMap["id"] = id
policyMap["origin_name"] = fileName
//将生产的签名存入redis中以备后用
RedisUtil.HMSET("file_"+id, policyMap)
//设置redis中的KEY有效期为1个小时
RedisUtil.EXPIRE("file_"+id, 3600)
policyMap["success"] = true
c.JSON(http.StatusOK, policyMap)
}