feat: 添加下载文件到浏览器功能
This commit is contained in:
@@ -22,6 +22,12 @@ func (c *file) DownloadToFile(ctx context.Context, req *dto.DownloadToFileReq) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DownloadToBrowser 下载文件到浏览器
|
||||||
|
func (c *file) DownloadToBrowser(ctx context.Context, req *dto.DownloadToBrowserReq) (res *beans.ResponseEmpty, err error) {
|
||||||
|
err = service.File.DownloadToBrowser(ctx, req)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// UploadFile 上传文件
|
// UploadFile 上传文件
|
||||||
func (c *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto.UploadFileRes, err error) {
|
func (c *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto.UploadFileRes, err error) {
|
||||||
return service.File.UploadFile(ctx, req)
|
return service.File.UploadFile(ctx, req)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -223,3 +224,45 @@ func DownloadToFile(ctx context.Context, fileURL string, localPath string) (err
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DownloadToBrowser 下载文件到浏览器(返回文件流,由 HTTP Response 直接写出)
|
||||||
|
// 参数 fileURL: MinIO 中的对象路径(即 objectName)
|
||||||
|
// 返回: 文件字节流、文件名、ContentType、错误
|
||||||
|
func DownloadToBrowser(ctx context.Context, fileURL string) (fileBytes []byte, fileName string, contentType string, err error) {
|
||||||
|
bucketName, err := utils.GetBucketName(ctx)
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf(ctx, "获取桶名称失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取对象流
|
||||||
|
object, err := minioClient.GetObject(ctx, bucketName, fileURL, minio.GetObjectOptions{})
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf(ctx, "获取文件流失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer object.Close()
|
||||||
|
|
||||||
|
// 获取对象元信息(用于读取 ContentType 和 Size)
|
||||||
|
info, err := object.Stat()
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf(ctx, "获取文件信息失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取全部内容
|
||||||
|
fileBytes, err = io.ReadAll(object)
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorf(ctx, "读取文件流失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取文件名
|
||||||
|
fileName = filepath.Base(fileURL)
|
||||||
|
contentType = info.ContentType
|
||||||
|
if contentType == "" {
|
||||||
|
contentType = "application/octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@ type DownloadToFileReq struct {
|
|||||||
LocalPath string `json:"localPath" dc:"本地路径"`
|
LocalPath string `json:"localPath" dc:"本地路径"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DownloadToBrowserReq 下载文件到浏览器请求
|
||||||
|
type DownloadToBrowserReq struct {
|
||||||
|
g.Meta `path:"/downloadToBrowser" method:"post" tags:"存储管理" summary:"下载文件到浏览器" dc:"下载文件到浏览器"`
|
||||||
|
FileURL string `json:"fileURL" dc:"文件URL" in:"query"`
|
||||||
|
}
|
||||||
|
|
||||||
// UploadFileReq 上传文件请求
|
// UploadFileReq 上传文件请求
|
||||||
type UploadFileReq struct {
|
type UploadFileReq struct {
|
||||||
g.Meta `path:"/uploadFile" method:"post" tags:"存储管理" summary:"上传文件" dc:"上传文件"`
|
g.Meta `path:"/uploadFile" method:"post" tags:"存储管理" summary:"上传文件" dc:"上传文件"`
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package service
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/url"
|
||||||
"oss/consts"
|
"oss/consts"
|
||||||
"oss/dao"
|
"oss/dao"
|
||||||
"oss/minio"
|
"oss/minio"
|
||||||
@@ -10,6 +11,7 @@ import (
|
|||||||
"oss/model/entity"
|
"oss/model/entity"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/gogf/gf/v2/net/ghttp"
|
||||||
"github.com/gogf/gf/v2/os/glog"
|
"github.com/gogf/gf/v2/os/glog"
|
||||||
|
|
||||||
"gitea.com/red-future/common/utils"
|
"gitea.com/red-future/common/utils"
|
||||||
@@ -27,6 +29,23 @@ func (f *file) DownloadToFile(ctx context.Context, req *dto.DownloadToFileReq) (
|
|||||||
return minio.DownloadToFile(ctx, req.FileURL, req.LocalPath)
|
return minio.DownloadToFile(ctx, req.FileURL, req.LocalPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DownloadToBrowser 下载文件到浏览器
|
||||||
|
func (f *file) DownloadToBrowser(ctx context.Context, req *dto.DownloadToBrowserReq) (err error) {
|
||||||
|
fileBytes, fileName, contentType, err := minio.DownloadToBrowser(ctx, req.FileURL)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r := ghttp.RequestFromCtx(ctx)
|
||||||
|
// 设置响应头
|
||||||
|
r.Response.Header().Set("Content-Type", contentType)
|
||||||
|
r.Response.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"; filename*=UTF-8''%s`, fileName, url.PathEscape(fileName)))
|
||||||
|
r.Response.Header().Set("Content-Length", fmt.Sprintf("%d", len(fileBytes)))
|
||||||
|
// 写出二进制流
|
||||||
|
r.Response.Write(fileBytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (f *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto.UploadFileRes, err error) {
|
func (f *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto.UploadFileRes, err error) {
|
||||||
fileSize := gconv.Int(req.File.Size)
|
fileSize := gconv.Int(req.File.Size)
|
||||||
totalFileSize := 0
|
totalFileSize := 0
|
||||||
|
|||||||
Reference in New Issue
Block a user