Files
hldrCenter/server/internal/handler/uploadimg/upload.go
2025-10-04 22:35:53 +08:00

114 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handler
import (
"fmt"
"net/http"
"strings"
"time"
"github.com/JACKYMYPERSON/hldrCenter/config"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/gin-gonic/gin"
)
// UploadImageHandler 处理图片上传到OSS
func UploadImageHandler(cfg *config.Config) gin.HandlerFunc {
// 闭包:内部函数可以访问 cfg 参数
return func(c *gin.Context) {
// 获取上传的图片文件
fileHeader, err := c.FormFile("image")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": "获取图片失败,请重新上传",
"error": err.Error(),
})
return
}
// 打开文件
file, err := fileHeader.Open()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"code": 500,
"message": "打开图片文件失败",
"error": err.Error(),
})
return
}
defer file.Close()
// 检查文件大小使用配置中的max_file_size
if fileHeader.Size > cfg.Upload.MaxFileSize {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": fmt.Sprintf("图片大小不能超过 %dMB", cfg.Upload.MaxFileSize>>20),
})
return
}
// 检查文件类型使用配置中的allow_image_types
fileType := fileHeader.Header.Get("Content-Type")
if !strings.Contains(cfg.Upload.AllowImageTypes, fileType) {
c.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"message": fmt.Sprintf("不支持的图片类型,仅允许:%s", cfg.Upload.AllowImageTypes),
})
return
}
// 初始化OSS客户端使用配置中的OSS参数
client, err := oss.New(
cfg.OSS.Endpoint,
cfg.OSS.AccessKeyID,
cfg.OSS.AccessKeySecret,
)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"code": 500,
"message": "初始化OSS客户端失败",
"error": err.Error(),
})
return
}
// 获取Bucket
bucket, err := client.Bucket(cfg.OSS.BucketName)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"code": 500,
"message": "获取Bucket失败",
"error": err.Error(),
})
return
}
// 生成唯一文件名
timestamp := time.Now().Format("20060102150405")
filename := fmt.Sprintf("%s_%s", timestamp, fileHeader.Filename)
objectKey := cfg.OSS.ObjectPrefix + filename // OSS中的完整对象键
// 上传文件到OSS
err = bucket.PutObject(objectKey, file)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"code": 500,
"message": "上传图片到OSS失败",
"error": err.Error(),
})
return
}
// 生成图片访问URL
host := strings.TrimPrefix(cfg.OSS.Endpoint, "https://")
imageURL := fmt.Sprintf("https://%s.%s/%s", cfg.OSS.BucketName, host, objectKey)
// 返回成功响应
c.JSON(http.StatusOK, gin.H{
"code": 200,
"message": "图片上传成功",
"data": gin.H{"url": imageURL},
})
}
}