186 lines
4.0 KiB
Go
186 lines
4.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/loveuer/nf-disk/internal/manager"
|
|
"github.com/loveuer/nf-disk/internal/s3"
|
|
"github.com/loveuer/nf-disk/ndh"
|
|
"github.com/loveuer/nf/nft/log"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
func FileUpload(c *ndh.Ctx) error {
|
|
type Req struct {
|
|
ConnId uint64 `json:"conn_id"`
|
|
Bucket string `json:"bucket"`
|
|
Location string `json:"location"`
|
|
Name string `json:"name"`
|
|
PublicRead bool `json:"public_read"`
|
|
PublicReadWrite bool `json:"public_read_write"`
|
|
DetectContentType bool `json:"detect_content_type"`
|
|
}
|
|
|
|
var (
|
|
err error
|
|
req = new(Req)
|
|
client *s3.Client
|
|
reader *os.File
|
|
info os.FileInfo
|
|
)
|
|
|
|
if err = c.ReqParse(req); err != nil {
|
|
return c.Send400(c, err.Error())
|
|
}
|
|
|
|
if req.Location == "" {
|
|
return c.Send400(req, "缺少文件位置")
|
|
}
|
|
|
|
if req.Name == "" {
|
|
req.Name = filepath.Base(req.Location)
|
|
}
|
|
|
|
if _, client, err = manager.Manager.Use(req.ConnId); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if reader, err = os.Open(req.Location); err != nil {
|
|
return c.Send400(err.Error(), fmt.Sprintf("文件: %s 打开错误", req.Location))
|
|
}
|
|
|
|
if info, err = reader.Stat(); err != nil {
|
|
log.Error("FileUpload: stat file info err = %s", err.Error())
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
obj := &s3.PutFilesObj{
|
|
Key: req.Name,
|
|
Reader: reader,
|
|
ContentLength: info.Size(),
|
|
ContentType: "",
|
|
ExpireAt: 0,
|
|
PublicRead: req.PublicRead,
|
|
PublicReadWrite: req.PublicReadWrite,
|
|
}
|
|
|
|
if req.DetectContentType {
|
|
bs := make([]byte, 128)
|
|
if _, err = reader.ReadAt(bs, 0); err != nil {
|
|
if !errors.Is(err, io.EOF) {
|
|
log.Error("FileUpload: read file to detect content_type err = %s", err.Error())
|
|
return c.Send500(err.Error())
|
|
}
|
|
}
|
|
|
|
obj.ContentType = http.DetectContentType(bs)
|
|
}
|
|
|
|
if err = client.PutFile(c.Context(), req.Bucket, obj); err != nil {
|
|
log.Error("FileUpload: client.PutFile err = %s", err.Error())
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
return c.Send200(req)
|
|
}
|
|
|
|
func FileInfo(c *ndh.Ctx) error {
|
|
type Req struct {
|
|
ConnId uint64 `json:"conn_id"`
|
|
Bucket string `json:"bucket"`
|
|
Key string `json:"key"`
|
|
}
|
|
|
|
var (
|
|
err error
|
|
req = new(Req)
|
|
client *s3.Client
|
|
info *s3.ObjectInfo
|
|
)
|
|
|
|
if err = c.ReqParse(req); err != nil {
|
|
return c.Send400(err.Error())
|
|
}
|
|
|
|
if _, client, err = manager.Manager.Use(req.ConnId); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if info, err = client.GetObjectInfo(c.Context(), req.Bucket, req.Key); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
return c.Send200(info)
|
|
}
|
|
|
|
func FileGet(c *ndh.Ctx) error {
|
|
type Req struct {
|
|
ConnId uint64 `json:"conn_id"`
|
|
Bucket string `json:"bucket"`
|
|
Key string `json:"key"`
|
|
}
|
|
|
|
var (
|
|
err error
|
|
req = new(Req)
|
|
client *s3.Client
|
|
link *s3.ObjectEntry
|
|
)
|
|
|
|
if err = c.ReqParse(req); err != nil {
|
|
return c.Send400(err.Error())
|
|
}
|
|
|
|
if _, client, err = manager.Manager.Use(req.ConnId); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if link, err = client.GetObjectEntry(c.Context(), req.Bucket, req.Key); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
return c.Send200(link)
|
|
}
|
|
|
|
func FileDownload(c *ndh.Ctx) error {
|
|
type Req struct {
|
|
ConnId uint64 `json:"conn_id"`
|
|
Bucket string `json:"bucket"`
|
|
Key string `json:"key"`
|
|
Location string `json:"location"`
|
|
}
|
|
|
|
var (
|
|
err error
|
|
req = new(Req)
|
|
client *s3.Client
|
|
obj *s3.ObjectEntity
|
|
target *os.File
|
|
)
|
|
|
|
if err = c.ReqParse(req); err != nil {
|
|
return c.Send400(err.Error())
|
|
}
|
|
|
|
if _, client, err = manager.Manager.Use(req.ConnId); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if obj, err = client.GetObject(c.Context(), req.Bucket, req.Key); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if target, err = os.OpenFile(filepath.Clean(req.Location), os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
if _, err = io.Copy(target, obj.Body); err != nil {
|
|
return c.Send500(err.Error())
|
|
}
|
|
|
|
return c.Send200(req)
|
|
}
|