我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用golang上传文件到SFTP主机失败

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用golang上传文件到SFTP主机失败

欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《使用golang上传文件到SFTP主机失败》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有以下 golang 函数来将文件上传到 sftp:

func uploadObjectToDestination(sshConfig SSHConnectionConfig, destinationPath string, class="lazy" data-srcFile io.Reader) {
    // Connect to destination host via SSH
    conn, err := ssh.Dial("tcp", sshConfig.sftpHost+sshConfig.sftpPort, sshConfig.authConfig)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // create new SFTP client
    client, err := sftp.NewClient(conn)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    log.Printf("Opening file on destination server under path %s", destinationPath)
    // create destination file
    dstFile, err := client.OpenFile(destinationPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)
    if err != nil {
        log.Fatal(err)
    }
    defer dstFile.Close()

    log.Printf("Copying file to %s", destinationPath)
    // copy source file to destination file
    bytes, err := io.Copy(dstFile, class="lazy" data-srcFile)
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("%s - Total %d bytes copied\n", dstFile.Name(), bytes)
}

上面的代码可以在 95% 的情况下工作,但对于某些文件会失败。这些失败的文件之间的唯一关系是大小(3-4kb)。其他成功的文件较小(0.5-3kb)。在某些情况下,大小为 2-3kb 的文件也会失败。

我能够使用不同的 sftp 服务器重现相同的问题。

当使用 sftp.write 更改失败代码(io.copy)时,我可以看到相同的行为,除了该过程不返回错误,而是我看到复制了 0 个字节,这似乎与io.copy 失败。

顺便说一句,当使用 io.copy 时,我收到的错误是 context 已取消,意外的 eof

代码从 aws lambda 运行,不存在内存或时间限制问题。


解决方案


经过几个小时的挖掘,事实证明,我的代码是问题的根源。 以下是答案,供以后参考: 还有另一个函数不在原始问题中,它从 s3 下载对象:

func getobjectfroms3(svc *s3.s3, bucket, key string) io.reader {
    var timeout = time.second * 30
    ctx := context.background()
    var cancelfn func()
    ctx, cancelfn = context.withtimeout(ctx, timeout)
    defer cancelfn()
    var input = &s3.getobjectinput{
        bucket: aws.string(bucket),
        key:    aws.string(key),
    }
    o, err := svc.getobjectwithcontext(ctx, input)
    if err != nil {
        if aerr, ok := err.(awserr.error); ok && aerr.code() == request.cancelederrorcode {
            log.fatal("download canceled due to timeout", err)
        } else {
            log.fatal("failed to download object", err)
        }
    }
    // load s3 file into memory, assuming small files
    return o.body
  }

上面的代码使用上下文,由于某种原因,对象返回的对象大小是错误的。 由于我在这里不使用上下文,因此我只是将代码转换为使用 getobject(input) 来解决问题。

func getObjectFromS3(svc *s3.S3, bucket, key string) io.Reader {
    var input = &s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }

    o, err := svc.GetObject(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            switch aerr.Code() {
            case s3.ErrCodeNoSuchKey:
                log.Fatal(s3.ErrCodeNoSuchKey, aerr.Error())
            default:
                log.Fatal(aerr.Error())
            }
        } else {
            // Print the error, cast err to awserr.Error to get the Code and
            // Message from an error.
            log.Fatal(err.Error())
        }
    }

    // Load S3 file into memory, assuming small files
    return o.Body
}

终于介绍完啦!小伙伴们,这篇关于《使用golang上传文件到SFTP主机失败》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用golang上传文件到SFTP主机失败

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用golang上传文件到SFTP主机失败

欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《使用golang上传文件到SFTP主机失败》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么
使用golang上传文件到SFTP主机失败
2024-04-04

ftp虚拟主机上传文件失败怎么解决

如果FTP虚拟主机上传文件失败,可能是由于以下几个原因导致的:1. 用户权限不足:检查是否使用正确的用户名和密码登录FTP虚拟主机,并确保该用户具有上传文件的权限。如果没有权限,联系服务提供商进行授权。2. 文件格式不兼容:某些FTP服务器
2023-09-05

通过 API 将文件上传到 Google Drive 失败

php小编西瓜告诉大家,有时候我们在使用 API 将文件上传到 Google Drive 的过程中可能会遇到失败的情况。这种情况可能是由于各种原因引起的,比如网络问题、权限不足等等。不过,不用担心,我们可以采取一些措施来解决这个问题。接下来
通过 API 将文件上传到 Google Drive 失败
2024-02-09

文件怎么上传到云主机

要将文件上传到云主机,可以使用以下几种方法:1. 使用FTP(文件传输协议):首先,在云主机上安装FTP服务器软件,例如vsftpd。然后,在本地计算机上使用FTP客户端软件连接到云主机的IP地址,并通过FTP客户端将文件上传到云主机上。2
2023-09-20

使用sftp命令上传文件夹方法

# 前言sftp上传单个文件使用put,多个文件可使用mput,但是要上传整个文件夹,则比较复杂,需要使用多个命令组合,包括find、awk等。# sftp上传文件夹```#!/bin/bash sss=`find /ngs/ecv1/Ap
2023-06-06

虚拟主机上传文件显示合并失败如何解决

虚拟主机上传文件显示合并失败可能是由于以下原因导致的:1. 文件命名冲突:检查是否存在同名的文件或文件夹,如果存在,则需要重新命名或删除其中一个。2. 文件权限问题:检查文件或文件夹的权限设置,确保上传的文件具有合适的读写权限。3. 文件大
2023-08-29

如何上传文件到虚拟主机

要上传文件到虚拟主机,您可以按照以下步骤操作:1. 获取虚拟主机的FTP登录信息。通常,您需要知道FTP服务器的主机名、用户名和密码。这些信息通常由您的虚拟主机提供商提供。2. 下载一个FTP客户端软件,例如FileZilla、WinSCP
2023-08-23

利用nodejs监控文件变化并使用sftp上传到服务器

最近在用react+express做一个自己的工具型网站(其实就是夺宝岛抢拍器) 然后因为经常要改动,而且又要放到服务器上进行测试。总是要webpack,然后手动把文件上传上去,不胜其烦,索性搜索了下,直接写个能检测文件变化并自动进行上传的
2022-06-04

怎么快速上传文件到云主机

要快速上传文件到云主机,可以使用以下几种方法:1. 使用FTP工具:安装一个FTP客户端工具,比如FileZilla、CuteFTP等,配置好连接信息,将文件通过FTP上传到云主机对应的目录中。2. 使用SCP命令:SCP(Secure C
2023-09-21

怎么把本地文件上传到云主机

要将本地文件上传到云主机,可以使用以下方法之一:1. 使用FTP客户端:安装一个FTP客户端程序(如FileZilla),打开该程序并连接到云主机的IP地址和FTP账号信息。然后,将本地文件从计算机的文件夹拖放到云主机的文件夹中。2. 使用
2023-08-19

Linux中怎么使用sFTP进行上传和下载文件

这篇文章主要讲解了“Linux中怎么使用sFTP进行上传和下载文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中怎么使用sFTP进行上传和下载文件”吧!sftp是一种安全的文件传
2023-06-27

怎么把本地文件上传到虚拟主机

要将本地文件上传到虚拟主机,可以按照以下步骤进行操作:1. 选择一个FTP工具:FTP(文件传输协议)是一种常用的文件传输协议,可以使用各种FTP客户端工具来上传文件。一些常见的FTP工具包括FileZilla、WinSCP等。选择一个你喜
2023-08-23

轻量应用服务器上传网页文件失败

1.检查文件大小限制在轻量应用服务器上上传网页文件失败可能是由于文件大小限制引起的。请确保你上传的文件大小没有超过服务器的限制。通常,服务器会有一个最大上传文件大小的限制,如果你的文件超过了这个限制,上传就会失败。你可以通过查看服务器的配置文件或联系服务器管理员来获取关于文件大小限制的信息。2.检查文件格式另一个可能导
2023-10-27

如何用ftp向云主机上传文件

要使用FTP向云主机上传文件,可以按照以下步骤进行操作:1. 打开一个FTP客户端软件,例如FileZilla或WinSCP等。2. 在FTP客户端中,输入云主机的IP地址或域名作为“主机”(或“服务器”)。3. 输入云主机的FTP端口号,
2023-08-21

如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输

SFTP是一种加密协议,能够安全地传输文件。本文指导您在CentOS服务器上配置SFTP,包括安装OpenSSH、启用SFTP子系统、创建SFTP用户和配置SFTP访问权限。此外,还提供了使用SFTP客户端连接到服务器和实施额外安全措施(如公钥认证和端口转发)的指南。通过遵循这些步骤,您可以有效保护文件传输并降低敏感数据泄露的风险。
如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输
2024-04-13

使用adb命令从电脑传文件到手机(传文件)

很多朋友纠结使用adb命令从电脑传文件到手机可以吗,使用adb命令从电脑传文件到手机可以吗安全吗?答案在本文中,对adb命令传输文件到手机或者从手机传文件到电脑相关知识感兴趣的朋友一起通过本文学习吧
2022-11-13

文件上传到云虚拟主机的方法是什么

要将文件上传到云虚拟主机,可以使用以下方法之一:1. FTP(文件传输协议):使用FTP客户端软件(如FileZilla、CuteFTP等),通过FTP协议将文件从本地计算机上传到云虚拟主机。需要提前设置FTP服务器的连接参数。2. SSH
2023-09-18

如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输

要在CentOS服务器上使用安全的文件传输协议(SFTP)来保护文件传输,需要执行以下步骤:1. 安装OpenSSH服务器:```shellsudo yum install openssh-server```2. 启动OpenSSH服务器并
2023-10-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录