9-20 1 views
SFTP客户端初始化
		| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65  | 
						import ( 	"MySQLExport/tools/tools" 	"github.com/pkg/sftp" 	"golang.org/x/crypto/ssh" 	"io" 	"log" 	"os" 	"time" ) type SFTP struct { 	Host     string 	User     string 	PassWord string 	Target   string 	SSHChn   *ssh.Client 	SFTPChn  *sftp.Client } // ClientInit 初始化SFTP连接 func (s *SFTP) ClientInit() { 	var err error 	sshConfig := &ssh.ClientConfig{ 		User: s.User, 		Auth: []ssh.AuthMethod{ 			ssh.Password(s.PassWord), 		}, 		HostKeyCallback: ssh.InsecureIgnoreHostKey(), 		ClientVersion:   "", 		Timeout:         10 * time.Second, 	} 	// 建立连接 	s.SSHChn, err = ssh.Dial("tcp", s.Host, sshConfig) 	if err != nil { 		log.Fatalln(err.Error()) 	} 	// 创建SFTP客户端 	s.SFTPChn, err = sftp.NewClient(s.SSHChn) 	if err != nil { 		log.Fatal(err) 	} } // Close 关闭连接 func (s *SFTP) Close() { 	s.SSHChn.Close() 	s.SFTPChn.Close() 	log.Printf("[%v] SFTP connection closed", s.Host) } // NewSFTP  创建一个新的SFTP客户端 func NewSFTP(host, user, password, dest string) *SFTP { 	s := &SFTP{ 		Host:     host, 		User:     user, 		PassWord: password, 		Target:   dest, 	} 	s.ClientInit() 	return s }  | 
					
文件上传
		| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54  | 
						func (s *SFTP) FileUpload(src, fileName string) { 	var err error 	//// 获取当前目录 	//cwd, err := s.SFTPChn.Getwd() 	//if err != nil { 	//	log.Fatal(err) 	//} 	remoteTargetDir := s.Target 	// 判断远程目录是否需要按日期生成 	remoteTargetDir = tools.ConvertDateSymbolToString(remoteTargetDir) 	// 不存在则创建,存在则不做动作 	err = s.SFTPChn.MkdirAll(remoteTargetDir) 	if err != nil { 		log.Fatalf("%v: %v", remoteTargetDir, err) 	} 	// 上传文件到远程目录 	remoteFilePath := remoteTargetDir + "/" + fileName 	log.Printf("[%v]\tStaring uploading...", src) 	// Create方法,如果远程文件存在,则替换,不存在则创建 	remoteFile, err := s.SFTPChn.Create(remoteFilePath) 	if err != nil { 		log.Fatalln(err) 	} 	defer remoteFile.Close() 	// 获取本地文件对象 	localFilePath := src 	localFile, err := os.Open(localFilePath) 	if err != nil { 		log.Fatal(err) 	} 	defer localFile.Close() 	// 将本地文件对象拷贝到远程 	n, err := io.Copy(remoteFile, localFile) 	if err != nil { 		log.Fatalln(err.Error()) 	} 	// 获取本地文件大小 	localFileInfo, err := os.Stat(localFilePath) 	if err != nil { 		log.Fatalln(err.Error()) 	} 	log.Printf("[%v(%v) ---> %s(%v)] : Files upload success!!!", localFilePath, tools.FormatFileSize(localFileInfo.Size()), 		remoteFilePath, 		tools.FormatFileSize(n)) }  | 
					
测试执行
		| 
					 1 2 3 4 5 6 7 8  | 
						// 创建SFTP连接 sftpClient := model.NewSFTP(host, user, password, dest) // 关闭链接 defer sftpClient.Close() // 上传文件 sftpClient.FileUpload(f, fileName)  | 
					
			如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!