使用 SFTP JSch 库可以上传多部分文件吗?

A s*_*vas 2 java sftp jsch

我想上传一个非常大的文件,它的大小可以是1 GB。是否可以将其上传或下载到/从 SFTP 服务器?我正在使用 JSch 库。

Mar*_*ryl 5

你的问题真的没有意义。你似乎做出了一些不正确的假设。但很难说这些是什么,因为你的问题相当少。

“分段上传”是与其他协议一起使用的术语。这些通常是基于 HTTP 的协议(如 S3、REST 等),因为 HTTP 在上传大文件时存在问题。例如,客户端和服务器之间的防火墙可能不允许 HTTP 连接保持打开足够长的时间来完成大文件的上传。

这通常与 SFTP 无关,至少有两个原因:

  • SFTP 使用持久连接,这与 HTTP 不同。因此防火墙通常不会限制 SFTP 会话的长度,因为这会破坏协议的任何常规使用,而不仅仅是上传。
  • SFTP 传输(包括上传)是基于数据包的,这与基于流的 HTTP 不同。所以它在某种程度上是有效的多部分。

    使用 SFTP,客户端发送任意长度的写入请求序列。不像 HTTP 那样是一种巨大的数据流。这些请求也可以在最终重新连接后恢复(这与“分段上传”完全相同)。

    使用 JSch 库,您可以使用参数的方法重载实现“分段上传”ChannelSftp.putoffset

    public OutputStream put(
        String dst, final SftpProgressMonitor monitor, final int mode, long offset)
        throws SftpException{
    
    Run Code Online (Sandbox Code Playgroud)

    或者,更简单的是,您可以使用ChannelSftp.RESUME模式,它会自行处理偏移量。另请参阅恢复文件传输中途失败的文件传输如何在 JSch SFTP 上享有声誉?

    但同样,您并不真正需要使用 SFTP 进行“分段上传”。该ChannelSftp.RESUME模式的目的是允许在(罕见的)断开连接的情况下恢复文件传输,而不是实现“分段上传”