一键打包生成oem项目exe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

127 lines
2.9 KiB

package masterFunc
import (
"fmt"
"io"
"os"
"path/filepath"
"strings"
"github.com/gogf/gf/v2/frame/g"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
)
// DownLoadCameraJpgBySftp 使用 SFTP 连接下载远程文件
func DownLoadMasterJpgBySftp(id int) error {
ip := "192.168.88.2:22" // SFTP 服务器地址 (通常是 SSH 协议端口)
username := "pi"
password := "picc2008"
// 配置 SSH 客户端
sshConfig := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{
ssh.Password(password),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主机密钥验证(不建议用于生产环境)
}
// 连接到 SSH 服务器
client, err := ssh.Dial("tcp", ip, sshConfig)
if err != nil {
fmt.Println("ssh.Dial error:", err)
return err
}
defer client.Close()
// 创建 SFTP 客户端
sftpClient, err := sftp.NewClient(client)
if err != nil {
fmt.Println("sftp.NewClient error:", err)
return err
}
defer sftpClient.Close()
fmt.Println("id:", id)
// 设定远程目录路径
remotePath := "/home/pi/photos/" + fmt.Sprint(id)
// 本地目录路径
localPathPhoto1 := "./downloads/" + fmt.Sprint(id) + "/photo1"
localPathPhoto2 := "./downloads/" + fmt.Sprint(id) + "/photo2"
// 创建本地目录
err = os.MkdirAll(localPathPhoto1, os.ModePerm)
if err != nil {
fmt.Println("os.MkdirAll error:", err)
return err
}
err = os.MkdirAll(localPathPhoto2, os.ModePerm)
if err != nil {
fmt.Println("os.MkdirAll error:", err)
return err
}
// 获取远程目录中的文件和子目录
entries, err := sftpClient.ReadDir(remotePath)
if err != nil {
fmt.Println("sftpClient.ReadDir error:", err)
return err
}
g.Dump("entries", entries, remotePath)
// 遍历远程目录中的所有文件
for _, entry := range entries {
localFilePath := ""
// 判断文件名称是否包含 _1.jpg
if strings.Contains(entry.Name(), "_1.jpg") {
// 生成本地文件路径
localFilePath = filepath.Join(localPathPhoto1, entry.Name())
}
// 判断文件名称是否包含 _8.jpg
if strings.Contains(entry.Name(), "_8.jpg") {
localFilePath = filepath.Join(localPathPhoto2, entry.Name())
}
// 下载文件
err := DownloadFile(sftpClient, remotePath+"/"+entry.Name(), localFilePath)
if err != nil {
return err
}
}
return nil
}
// DownloadFile 下载单个文件
func DownloadFile(client *sftp.Client, remoteFile, localFile string) error {
// 创建本地文件
file, err := os.Create(localFile)
if err != nil {
fmt.Println("os.Create error:", err)
return err
}
defer file.Close()
// 打开远程文件
remoteFileHandle, err := client.Open(remoteFile)
if err != nil {
fmt.Println("client.Open error:", err)
return err
}
defer remoteFileHandle.Close()
// 将文件内容从远程文件复制到本地文件
_, err = io.Copy(file, remoteFileHandle)
if err != nil {
fmt.Println("io.Copy error:", err)
return err
}
fmt.Println("Downloaded file:", localFile)
return nil
}