125 lines
2.7 KiB
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
|
|
}
|