124 lines
2.9 KiB
Go
124 lines
2.9 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"ifms/internal/config"
|
|
"ifms/pkg/logging"
|
|
"ifms/pkg/oss"
|
|
"os"
|
|
"path"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// 上传图片文件
|
|
func UploadImg(c *gin.Context, ctx context.Context, prefix string) (error, *oss.PutObjectResult) {
|
|
u := FromLoginUser(ctx)
|
|
// 使用表单上传文件
|
|
img, err := c.FormFile("img")
|
|
if err != nil {
|
|
return errors.New("图片上传失败"), nil
|
|
}
|
|
if img == nil {
|
|
ResError(c, errors.New("请选择图片上传"))
|
|
return errors.New("请选择图片上传"), nil
|
|
}
|
|
fn := fmt.Sprintf("%s/%s", "./img", img.Filename)
|
|
fileExt := path.Ext(fn)
|
|
f := fmt.Sprintf("%d%s", time.Now().Unix(), fileExt)
|
|
filename := fmt.Sprintf("%d/%s", u.ID, f)
|
|
err = c.SaveUploadedFile(img, filename)
|
|
if err != nil {
|
|
return errors.New("图片上传失败"), nil
|
|
}
|
|
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return errors.New("图片上传失败"), nil
|
|
}
|
|
defer file.Close()
|
|
|
|
// 获取文件大小
|
|
fileInfo, err := file.Stat()
|
|
if err != nil {
|
|
return errors.New("图片上传失败"), nil
|
|
}
|
|
fileSize := fileInfo.Size()
|
|
name := oss.FormatObjectName(prefix, f)
|
|
ossResult, err := oss.Ins.PutObject(ctx, config.C.AliyunOSS.Bucket, name, file, fileSize, oss.PutObjectOptions{
|
|
ContentType: "text/plain",
|
|
UserMetadata: map[string]string{"name": f},
|
|
})
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
ossResult.ETag = img.Filename
|
|
|
|
// 在 OSS 上传成功后删除本地文件
|
|
if err == nil {
|
|
errDel := os.Remove(filename)
|
|
if errDel != nil {
|
|
logging.Context(ctx).Error("删除本地文件失败:" + errDel.Error())
|
|
}
|
|
}
|
|
|
|
return err, ossResult
|
|
}
|
|
|
|
// 上传文件
|
|
func UploadFile(c *gin.Context, ctx context.Context, prefix string) (error, *oss.PutObjectResult) {
|
|
u := FromLoginUser(ctx)
|
|
// 使用表单上传文件
|
|
formFile, err := c.FormFile("file")
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
if formFile == nil {
|
|
ResError(c, errors.New("请选择文件上传"))
|
|
return err, nil
|
|
}
|
|
fn := fmt.Sprintf("%s/%s", "./file", formFile.Filename)
|
|
fileExt := path.Ext(fn)
|
|
f := fmt.Sprintf("%d%s", time.Now().Unix(), fileExt)
|
|
filename := fmt.Sprintf("%d/%s", u.ID, f)
|
|
err = c.SaveUploadedFile(formFile, filename)
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
defer file.Close()
|
|
|
|
// 获取文件大小
|
|
fileInfo, err := file.Stat()
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
fileSize := fileInfo.Size()
|
|
name := oss.FormatObjectName(prefix, f)
|
|
ossResult, err := oss.Ins.PutObject(ctx, config.C.AliyunOSS.Bucket, name, file, fileSize, oss.PutObjectOptions{
|
|
ContentType: "text/plain",
|
|
UserMetadata: map[string]string{"name": f},
|
|
})
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
ossResult.ETag = formFile.Filename
|
|
|
|
// 在 OSS 上传成功后删除本地文件
|
|
if err == nil {
|
|
errDel := os.Remove(filename)
|
|
if errDel != nil {
|
|
logging.Context(ctx).Error("删除本地文件失败:" + errDel.Error())
|
|
}
|
|
}
|
|
|
|
return err, ossResult
|
|
}
|