Private
Public Access
1
0

新增: 云OSS存储集成(七牛云+阿里云)+多桶导航+GBK编码自动转换

This commit is contained in:
2026-05-05 03:18:47 +08:00
parent eb5b85e007
commit b4f4b4627d
34 changed files with 5225 additions and 48 deletions

137
app.go
View File

@@ -18,6 +18,7 @@ import (
"u-desk/internal/api"
"u-desk/internal/common"
"u-desk/internal/filesystem"
osssvc "u-desk/internal/ossdrv"
"u-desk/internal/service"
"u-desk/internal/sftp"
"u-desk/internal/storage"
@@ -38,6 +39,7 @@ type App struct {
pdfAPI *api.PdfAPI
filesystem *filesystem.FileSystemService
sftpService *sftp.Service
ossService *osssvc.Service
profileSvc *service.ProfileService
isAlwaysOnTop bool
mu sync.Mutex
@@ -217,6 +219,9 @@ func (a *App) ServiceShutdown() error {
}
sftp.CleanupTempFiles()
// 关闭所有 OSS 连接
osssvc.GetManager().Shutdown()
return nil
}
@@ -972,6 +977,104 @@ func (a *App) SftpGetSystemInfo(connID string) (map[string]interface{}, error) {
return a.ensureSftpService().GetSystemInfo(connID)
}
// ========== OSS 接口 ==========
func (a *App) ensureOssService() *osssvc.Service {
a.mu.Lock()
defer a.mu.Unlock()
if a.ossService == nil {
a.ossService = osssvc.NewService()
}
return a.ossService
}
type OssConnectRequest struct {
Provider string `json:"provider"`
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
Endpoint string `json:"endpoint"`
}
func (a *App) OssConnect(req OssConnectRequest) (string, error) {
if err := a.ensureOssService().GetManager().Connect(req.Provider, req.AccessKey, req.SecretKey, req.Endpoint); err != nil {
return "", err
}
return req.Provider, nil
}
// OssDisconnect 断开 OSS 连接
func (a *App) OssDisconnect(connID string) error {
osssvc.GetManager().Disconnect(connID)
return nil
}
// OssListDir OSS 列出目录
func (a *App) OssListDir(connID string, prefix string) ([]map[string]interface{}, error) {
return a.ensureOssService().ListDir(connID, prefix)
}
// OssDownloadToTemp OSS 下载到临时文件
func (a *App) OssDownloadToTemp(connID string, key string) (string, error) {
return a.ensureOssService().DownloadToTemp(connID, key)
}
// OssReadFile OSS 读取文件
func (a *App) OssReadFile(connID string, key string) (string, error) {
return a.ensureOssService().ReadFile(connID, key)
}
// OssWriteFile OSS 写入文件
func (a *App) OssWriteFile(connID string, key string, content string) error {
return a.ensureOssService().WriteFile(connID, key, content)
}
// OssWriteBase64File OSS 写入 base64 编码文件
func (a *App) OssWriteBase64File(connID string, key string, base64Content string) error {
return a.ensureOssService().WriteBase64File(connID, key, base64Content)
}
// OssGetFileInfo OSS 获取文件信息
func (a *App) OssGetFileInfo(connID string, key string) (map[string]interface{}, error) {
return a.ensureOssService().GetFileInfo(connID, key)
}
// OssCreateDir OSS 创建目录
func (a *App) OssCreateDir(connID string, dirPath string) (*filesystem.FileOperationResult, error) {
return a.ensureOssService().CreateDir(connID, dirPath)
}
// OssCreateFile OSS 创建文件
func (a *App) OssCreateFile(connID string, filePath string) (*filesystem.FileOperationResult, error) {
return a.ensureOssService().CreateFile(connID, filePath)
}
// OssDeletePath OSS 删除
func (a *App) OssDeletePath(connID string, key string) (*filesystem.FileOperationResult, error) {
return a.ensureOssService().DeletePath(connID, key)
}
// OssRenamePathRequest OSS 重命名请求
type OssRenamePathRequest struct {
ConnID string `json:"conn_id"`
OldPath string `json:"old_path"`
NewPath string `json:"new_path"`
}
// OssRenamePath OSS 重命名
func (a *App) OssRenamePath(req OssRenamePathRequest) (*filesystem.FileOperationResult, error) {
return a.ensureOssService().RenamePath(req.ConnID, req.OldPath, req.NewPath)
}
// OssGetCommonPaths OSS 获取常用路径
func (a *App) OssGetCommonPaths(connID string) (map[string]string, error) {
return a.ensureOssService().GetCommonPaths(connID)
}
// OssGetSignedURL OSS 获取预签名 URL
func (a *App) OssGetSignedURL(connID string, key string) (string, error) {
return a.ensureOssService().GetSignedURL(connID, key)
}
// --- 连接配置 CRUD (SQLite 持久化) ---
type SaveProfileRequest struct {
@@ -984,6 +1087,11 @@ type SaveProfileRequest struct {
KeyPath string `json:"key_path"`
Type string `json:"type"`
Token string `json:"token"`
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
Bucket string `json:"bucket"`
Region string `json:"region"`
Endpoint string `json:"endpoint"`
LastConnected *int64 `json:"last_connected"`
}
@@ -1002,17 +1110,22 @@ func (a *App) LoadConnectionProfiles() ([]map[string]interface{}, error) {
result := make([]map[string]interface{}, len(list))
for i, p := range list {
result[i] = map[string]interface{}{
"id": float64(p.ID),
"name": p.Name,
"host": p.Host,
"port": p.Port,
"username": p.Username,
"password": p.Password,
"keyPath": p.KeyPath,
"type": p.Type,
"token": p.Token,
"lastConnected": p.LastConnected,
"sortOrder": float64(p.SortOrder),
"id": float64(p.ID),
"name": p.Name,
"host": p.Host,
"port": p.Port,
"username": p.Username,
"password": p.Password,
"keyPath": p.KeyPath,
"type": p.Type,
"token": p.Token,
"accessKey": p.AccessKey,
"secretKey": p.SecretKey,
"bucket": p.Bucket,
"region": p.Region,
"endpoint": p.Endpoint,
"lastConnected": p.LastConnected,
"sortOrder": float64(p.SortOrder),
}
}
return result, nil
@@ -1023,6 +1136,8 @@ func (a *App) SaveConnectionProfile(req SaveProfileRequest) (map[string]interfac
Name: req.Name, Host: req.Host, Port: req.Port,
Username: req.Username, Password: req.Password,
KeyPath: req.KeyPath, Type: req.Type, Token: req.Token,
AccessKey: req.AccessKey, SecretKey: req.SecretKey,
Bucket: req.Bucket, Region: req.Region, Endpoint: req.Endpoint,
}
if req.LastConnected != nil {
t := time.Unix(*req.LastConnected, 0)