pcm-ai4m/service/system/sftp.go

125 lines
2.7 KiB
Go

package system
import (
"ai4m/model/system"
"fmt"
"github.com/gabriel-vasile/mimetype"
"github.com/klauspost/compress/zip"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
"io"
"log"
"os"
)
type SFTPService struct {
}
func (sftpService *SFTPService) SFTPUpload(sftpObj system.SFTPObj) error {
pwd, err := os.Getwd()
if err != nil {
return err
}
r, err := zip.OpenReader(pwd + "\\" + sftpObj.File.Filename)
if err != nil {
return err
}
defer r.Close()
for _, f := range r.File {
sftpObj.Files = append(sftpObj.Files, f)
}
config := &ssh.ClientConfig{
User: sftpObj.User,
Auth: []ssh.AuthMethod{
ssh.Password(sftpObj.Password), // 或者使用ssh.PublicKeys等其他认证方式
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
// 连接到SSH服务器
client, err := ssh.Dial("tcp", sftpObj.Address, config)
if err != nil {
return err
}
// 打开SFTP会话
session, err := sftp.NewClient(client)
if err != nil {
return err
}
defer session.Close()
// 打开本地文件
for _, file := range sftpObj.Files {
localFile, err := file.Open()
if err != nil {
return err
}
// 在SFTP服务器上创建文件
remoteFile, err := session.Create(sftpObj.RemotePath + "/" + file.Name)
if err != nil {
return err
}
// 复制文件内容
_, err = io.Copy(remoteFile, localFile)
if err != nil {
return err
}
fmt.Println("File uploaded successfully")
if err = localFile.Close(); err != nil {
log.Printf("Error closing file: %v", err)
}
if err = remoteFile.Close(); err != nil {
log.Printf("Error closing file: %v", err)
}
return nil
}
return nil
}
func (sftpService *SFTPService) SFTPDownload(sftpObj system.SFTPObj) (*system.ResFile, error) {
config := &ssh.ClientConfig{
User: sftpObj.User,
Auth: []ssh.AuthMethod{
ssh.Password(sftpObj.Password), // 或者使用ssh.PublicKeys等其他认证方式
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
// 连接到SSH服务器
client, err := ssh.Dial("tcp", sftpObj.Address, config)
if err != nil {
return nil, err
}
// 打开SFTP会话
session, err := sftp.NewClient(client)
if err != nil {
return nil, err
}
defer session.Close()
// 打开远程文件
remoteFile, err := session.Open(sftpObj.RemotePath)
if err != nil {
return nil, err
}
fileInfo, err := remoteFile.Stat()
if err != nil {
return nil, err
}
defer remoteFile.Close()
// 获取文件内容
fileContent, err := io.ReadAll(remoteFile)
if err != nil {
return nil, err
}
// 获取文件类型
mimeType := mimetype.Detect(fileContent)
resFile := system.ResFile{
Name: fileInfo.Name(),
Content: fileContent,
MimeType: mimeType.String(),
}
return &resFile, nil
}