当前位置: 首页 > news >正文

golang实现从服务器下载文件到本地指定目录

一、连接服务器,采用sftp连接模式

package middlewaresimport ("fmt""time""github.com/pkg/sftp""golang.org/x/crypto/ssh"
)// 建立服务器连接
func Connect(user, password, host string, port int) (*sftp.Client, error) {var (auth         []ssh.AuthMethodaddr         stringclientConfig *ssh.ClientConfigsshClient    *ssh.ClientsftpClient   *sftp.Clienterr          error)// get auth methodauth = make([]ssh.AuthMethod, 0)auth = append(auth, ssh.Password(password))clientConfig = &ssh.ClientConfig{User: user,Auth: []ssh.AuthMethod{ssh.Password(password)},// 此处忽略了密钥认证,改用密码认证HostKeyCallback: ssh.InsecureIgnoreHostKey(),Timeout:         30 * time.Second,}// 通过ssh连接到服务器addr = fmt.Sprintf("%s:%d", host, port)if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil {return nil, err}// 创建一个sftp连接工具用来读取文件或者目录if sftpClient, err = sftp.NewClient(sshClient); err != nil {return nil, err}return sftpClient, nil
}

二、下载文件

// 定义下载功能
func SyncCiticLog(r *gin.Context) {// viper设置的连接服务器的用户名和密码以及端口、连接的IP地址,此用户名写在了配置文件中User := viper.GetString("ConnectUser")Password := viper.GetString("ConnectPassword")Port := viper.GetInt("ConnectPort")citicIp := viper.GetString("ConnectOldIp")// 此处设置了要读取的目录前缀const allDir = "D:\\backup\\citic"// 定义变量用来接收下载文件的源目录和目标目录dstDir := ""srcDir := ""// 实例化结构体用来接收数据downloglist := DownLogList{}// 调用定义的sftp方法连接服务器sftpClient, sftpErr := middlewares.Connect(User, Password, citicIp, Port)// 此处要关闭要用defer关闭连接,否则下载的文件将发生打开文件错误defer sftpClient.Close()// 判断连接是否成功if sftpErr != nil {logs.Error(map[string]interface{}{"msg": sftpErr}, "未连接到服务器,请检查相关配置!")}// 此处用的Post请求,在请求体获取前端传递过来的参数if error := r.ShouldBindBodyWithJSON(&downloglist); error != nil {logs.Error(map[string]interface{}{"msg": "绑定结构体失败"}, "请检查配置文件是否正确!")} else {// 判断传递过来的IP,来定义相应的源目录和目标目录switch downloglist.ServiceIp {case "172.16.2.51":srcDir = "/home/backup/zqyl-abc/new"dstDir = "D:\\backup\\abc"breakcase "172.16.2.58":srcDir = "/home/backup/citic/" + downloglist.ServiceIpdstDir = filepath.Join(allDir, "中信03")breakcase "172.16.2.59":srcDir = "/home/backup/citic/" + downloglist.ServiceIpdstDir = filepath.Join(allDir, "中信04")breakcase "172.16.2.60":srcDir = "/home/backup/citic/" + downloglist.ServiceIpdstDir = filepath.Join(allDir, "中信01")breakcase "172.16.2.61":srcDir = "/home/backup/citic/" + downloglist.ServiceIpdstDir = filepath.Join(allDir, "中信02")break}// 由于传递过来的下载文件是多个,所以将以集合的形式传递过来,循环遍历来将单个文件进行下载for _, citicLog := range downloglist.LogList {// 拼出源文件的位置目录fileSrcDir := srcDir + "/" + citicLog// 利用sftp连接工具将文件目录打开openFile, err := sftpClient.Open(fileSrcDir)if err != nil {logs.Error(map[string]interface{}{"msg": "读取文件失败!"}, "请检查文件是否存在或者是否正常!")}// 创建本地文件存放的目录error := os.MkdirAll(dstDir, 0755)if error != nil {logs.Error(map[string]interface{}{"msg": "创建文件失败!"}, "请检查目录是否存在!")}// 创建本地文件的等待拷贝logFile, _ := os.Create(dstDir + "\\" + citicLog)// 创建资源记得关闭defer logFile.Close()// 拷贝文件至目标目录_, copyErr := io.Copy(logFile, openFile)if copyErr != nil {logs.Info(map[string]interface{}{"msg": "下载文件失败,请检查磁盘分区是否存在或者是否可写入状态!!"}, "")}}// 返回给前端状态码、下载成功信息、目标文件下载到的目录r.JSON(http.StatusOK, gin.H{"status":  http.StatusOK,"message": "下载成功!","path":    dstDir,})}
}
http://www.lryc.cn/news/438577.html

相关文章:

  • C++数据结构-树的概念及分类介绍(基础篇)
  • 职场 Death Note
  • Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器
  • RAII 与 std::lock_guard 在 C++ 中的应用:自动化互斥锁管理与线程安全
  • 风格汇:奢华风格在UI设计中如何被定义的。
  • Vue2 qrcode+html2canvas 实现二维码的生成和保存
  • GEE 教程:利用Google Dynamic数据进行逐月指定区域的土地分类数据提取分析
  • Nginx 负载均衡:优化网站性能与可扩展性的利器
  • 【Python基础】Python错误和异常处理(详细实例)
  • 如何查看串口被哪个程序占用?截止目前最方便的方法
  • 深入理解SpringBoot(一)----SpringBoot的启动流程分析
  • MySql基础-单表操作
  • 【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
  • SpringBoot开发——整合Redis
  • OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
  • P5425 [USACO19OPEN] I Would Walk 500 Miles G
  • Java高级Day41-反射入门
  • 在Linux系统上使用Docker部署java项目
  • 【C++】标准库IO查漏补缺
  • python简单易懂的lxml读取HTML节点及常用操作方法
  • Java | Leetcode Java题解之第406题根据身高重建队列
  • 安卓获取apk的公钥,用于申请app备案等
  • 【leetcode_python】杨辉三角
  • Parallels Desktop 20 for Mac中文版发布了?会哪些新功能
  • SpringBoot整合SSE-灵活管控连接
  • 挖矿木马-Linux
  • 【leetcode——415场周赛】——python前两题
  • 【CSS in Depth 2 精译_029】5.2 Grid 网格布局中的网格结构剖析(上)
  • ZYNQ LWIP(RAW API) TCP函数学习
  • Spring Boot,在应用程序启动后执行某些 SQL 语句