123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- package controllers
- import (
- "fmt"
- "github.com/gogf/gf/net/ghttp"
- "gxt-file-server/app/bll"
- context2 "gxt-file-server/app/context"
- "gxt-file-server/app/errors"
- "gxt-file-server/app/schema"
- "gxt-file-server/pkg/gplus"
- "net/url"
- "strconv"
- "strings"
- )
- // NewFile 创建文件管理控制器
- func NewFile(bFile bll.IFile) *File {
- return &File{
- FileBll: bFile,
- }
- }
- // File 文件管理
- // @Name File
- // @Description 文件管理
- type File struct {
- FileBll bll.IFile
- }
- // Upload 上传文件
- func (a *File) Upload(r *ghttp.Request) {
- var params schema.UploadParams
- if err := gplus.ParseJson(r, ¶ms); err != nil {
- gplus.ResError(r, err)
- }
- ctx := gplus.NewContext(r)
- if v := r.Header.Get("FILE-EXPIRE"); v != "" {
- m, err := strconv.Atoi(v)
- if err != nil {
- gplus.ResError(r, errors.ErrHeaderParamsError)
- }
- ctx = context2.NewFileExpireContext(ctx, m)
- }
- if v := r.Header.Get("FILE-HASH"); v != "" {
- ctx = context2.NewFileHashContext(ctx, v)
- }
- info, err := a.FileBll.Upload(ctx, r.Request, params.FormKey, params.BaseUrl)
- if err != nil {
- gplus.ResError(r, err)
- return
- }
- gplus.ResSuccess(r, info)
- }
- // Download 下载文件
- func (a *File) Download(r *ghttp.Request) {
- if r.GetString("path") == "" || r.GetString("name") == "" {
- gplus.ResError(r, errors.ErrBadRequest)
- }
- path, err := url.PathUnescape(r.GetString("path"))
- if err != nil {
- gplus.ResError(r, err)
- }
- fileData, contentType, err := a.FileBll.Download(gplus.NewContext(r), path)
- if err != nil {
- gplus.ResError(r, err)
- }
- if strings.HasPrefix(contentType, "text/html") ||
- strings.HasPrefix(contentType, "application/javascript") {
- contentType = "text/plain; charset=utf-8"
- }
- r.Response.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", r.GetString("name")))
- r.Response.Header().Set("Content-Type", "application/octet-stream")
- // r.Response.Header().Set("Content-Type", contentType)
- r.Response.Header().Set("Cache-Control", "max-age=31536000")
- r.Response.Header().Set("Content-Length", strconv.FormatInt(int64(len(fileData)), 10))
- r.Response.Write(fileData)
- }
- // Persistent 设置文件为持久化
- func (a *File) Persistent(r *ghttp.Request) {
- var param schema.PersistentFileRequest
- if err := gplus.ParseJson(r, ¶m); err != nil {
- gplus.ResError(r, err)
- }
- err := a.FileBll.Persistent(gplus.NewContext(r), param.Hash)
- if err != nil {
- gplus.ResError(r, err)
- }
- gplus.ResOK(r)
- }
- // Chunk 分块上传
- func (a *File) Chunk(r *ghttp.Request) {
- var param schema.FileChunkUploadReq
- if err := gplus.ParseJson(r, ¶m); err != nil {
- gplus.ResError(r, err)
- }
- result, err := a.FileBll.ChunkUpload(gplus.NewContext(r), schema.FileChunkParams{
- HttpRequest: r.Request,
- FormKey: param.FormKey,
- BaseUrl: param.BaseUrl,
- Index: param.Index,
- Total: param.Total,
- Hash: param.Hash,
- })
- if err != nil {
- gplus.ResError(r, err)
- }
- gplus.ResSuccess(r, result)
- }
- // Merge 文件分块合并
- func (a *File) Merge(r *ghttp.Request) {
- var param schema.FileMergeParams
- if err := gplus.ParseJson(r, ¶m); err != nil {
- gplus.ResError(r, err)
- }
- result, err := a.FileBll.FileMerge(gplus.NewContext(r), schema.FileMergeParams{
- HttpRequest: r.Request,
- BaseUrl: param.BaseUrl,
- Total: param.Total,
- Hash: param.Hash,
- FileName: param.FileName,
- })
- if err != nil {
- gplus.ResError(r, err)
- }
- gplus.ResSuccess(r, result)
- }
|