ifms_go/pkg/util/upload.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
}