feat: 完成了 新建桶; 上传文件(基本功能)
todo: 上传 rename, 上传 public 权限选择 bug: 首次加载 conns list; 上传的时候前缀过滤失败
This commit is contained in:
@ -38,3 +38,36 @@ func BucketFiles(c *ndh.Ctx) error {
|
||||
|
||||
return c.Send200(map[string]any{"list": list})
|
||||
}
|
||||
|
||||
func BucketCreate(c *ndh.Ctx) error {
|
||||
type Req struct {
|
||||
ConnId uint64 `json:"conn_id"`
|
||||
Name string `json:"name"`
|
||||
PublicRead bool `json:"public_read"`
|
||||
PublicReadWrite bool `json:"public_read_write"`
|
||||
}
|
||||
|
||||
var (
|
||||
err error
|
||||
req = new(Req)
|
||||
client *s3.Client
|
||||
)
|
||||
|
||||
if err = c.ReqParse(req); err != nil {
|
||||
return c.Send400(err.Error())
|
||||
}
|
||||
|
||||
if req.Name == "" {
|
||||
return c.Send400(req, "桶名不能为空")
|
||||
}
|
||||
|
||||
if _, client, err = manager.Manager.Use(req.ConnId); err != nil {
|
||||
return c.Send500(err.Error())
|
||||
}
|
||||
|
||||
if err = client.CreateBucket(c.Context(), req.Name, req.PublicRead, req.PublicReadWrite); err != nil {
|
||||
return c.Send500(err.Error())
|
||||
}
|
||||
|
||||
return c.Send200(map[string]any{"bucket": req.Name})
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ package handler
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/loveuer/nf-disk/internal/db"
|
||||
"github.com/loveuer/nf-disk/internal/manager"
|
||||
"github.com/loveuer/nf-disk/internal/model"
|
||||
@ -211,18 +210,11 @@ func ConnectionBuckets(c *ndh.Ctx) error {
|
||||
return c.Send500(err.Error())
|
||||
}
|
||||
|
||||
// todo: for frontend test
|
||||
buckets = append(buckets, &s3.ListBucketRes{
|
||||
Name: "这是一个非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长的名字",
|
||||
CreatedAt: time.Now().UnixMilli(),
|
||||
})
|
||||
|
||||
// todo: for frontend test
|
||||
for i := 1; i <= 500; i++ {
|
||||
buckets = append(buckets, &s3.ListBucketRes{
|
||||
CreatedAt: time.Now().UnixMilli(),
|
||||
Name: fmt.Sprintf("test-bucket-%03d", i),
|
||||
})
|
||||
}
|
||||
|
||||
return c.Send200(map[string]any{"list": buckets})
|
||||
}
|
||||
|
56
internal/handler/dialog.go
Normal file
56
internal/handler/dialog.go
Normal file
@ -0,0 +1,56 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/loveuer/nf-disk/ndh"
|
||||
"github.com/samber/lo"
|
||||
"github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
)
|
||||
|
||||
func DialogOpen(ctx context.Context) ndh.Handler {
|
||||
return func(c *ndh.Ctx) error {
|
||||
type Req struct {
|
||||
Title string `json:"title"`
|
||||
Type string `json:"type"` // "dir", "multi", ""
|
||||
Filters []string `json:"filters"`
|
||||
}
|
||||
|
||||
var (
|
||||
err error
|
||||
req = new(Req)
|
||||
opt = runtime.OpenDialogOptions{
|
||||
Title: "请选择文件",
|
||||
}
|
||||
result any
|
||||
)
|
||||
|
||||
if err = c.ReqParse(req); err != nil {
|
||||
return c.Send400(err.Error())
|
||||
}
|
||||
|
||||
if req.Title != "" {
|
||||
opt.Title = req.Title
|
||||
}
|
||||
|
||||
if len(req.Filters) > 0 {
|
||||
opt.Filters = lo.Map(req.Filters, func(item string, index int) runtime.FileFilter {
|
||||
return runtime.FileFilter{Pattern: item}
|
||||
})
|
||||
}
|
||||
|
||||
switch req.Type {
|
||||
case "dir":
|
||||
result, err = runtime.OpenDirectoryDialog(ctx, opt)
|
||||
case "multi":
|
||||
result, err = runtime.OpenMultipleFilesDialog(ctx, opt)
|
||||
default:
|
||||
result, err = runtime.OpenFileDialog(ctx, opt)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return c.Send500(err.Error())
|
||||
}
|
||||
|
||||
return c.Send200(map[string]interface{}{"result": result})
|
||||
}
|
||||
}
|
88
internal/handler/file.go
Normal file
88
internal/handler/file.go
Normal file
@ -0,0 +1,88 @@
|
||||
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)
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package handler
|
||||
|
||||
import "github.com/loveuer/nf-disk/ndh"
|
||||
|
||||
func ListItem(c *ndh.Ctx) error {
|
||||
type Req struct {
|
||||
Id uint64 `json:"id"`
|
||||
Bucket string `json:"bucket"`
|
||||
}
|
||||
|
||||
var (
|
||||
err error
|
||||
req = new(Req)
|
||||
)
|
||||
|
||||
if err = c.ReqParse(req); err != nil {
|
||||
return c.Send400(err.Error())
|
||||
}
|
||||
|
||||
panic("implement me!!!")
|
||||
}
|
Reference in New Issue
Block a user