新增: 云OSS存储集成(七牛云+阿里云)+多桶导航+GBK编码自动转换
This commit is contained in:
137
app.go
137
app.go
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user