You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java以流形式将Azure Blob直接复制到SFTP服务器

Azure Blob 直传SFTP实现方案(无本地磁盘写入)

依赖准备

首先引入SFTP工具库JSch的Maven依赖:

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

完整实现代码

你可以在原有代码的基础上补充以下逻辑,全程通过流传输,无本地磁盘写入:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import java.io.InputStream;
import java.util.logging.Level;

public static void main(){
        final String CONNECTION_STRING_SRC = "......";
        final String SOURCE_CONTAINER = "decrypted";
        final String FILE_CONTAINER = "callinteractiondata";
        // Connecting to the source Storage Account (ccdmrecordinginbound)
        BlobServiceClient blobServiceClient1 = new BlobServiceClientBuilder().connectionString(CONNECTION_STRING_SRC).buildClient();
        BlobContainerClient srcContainer = blobServiceClient1.getBlobContainerClient(SOURCE_CONTAINER);
        logger.log(java.util.logging.Level.FINE,"Connected to the source container");
        String blobName ="TestMP3 files";
        BlobClient sourceBlobClient = srcContainer.getBlobClient(blobName);

        // 以下为SFTP传输实现逻辑
        // SFTP配置请替换为实际参数
        String sftpHost = "SFTP主机地址";
        int sftpPort = 22;
        String sftpUsername = "SFTP登录用户名";
        String sftpPassword = "SFTP登录密码";
        String sftpTargetFullPath = "/sftp/目标目录/" + blobName; // SFTP上的完整存储路径

        Session sftpSession = null;
        ChannelSftp sftpChannel = null;
        try (
            // 直接获取Azure Blob输入流,无需写入本地
            InputStream blobInputStream = sourceBlobClient.openInputStream()
        ){
            // 初始化SFTP连接
            JSch jsch = new JSch();
            sftpSession = jsch.getSession(sftpUsername, sftpHost, sftpPort);
            sftpSession.setPassword(sftpPassword);
            // 跳过主机密钥校验,生产环境建议配置known_hosts替换该配置
            sftpSession.setConfig("StrictHostKeyChecking", "no");
            sftpSession.connect();

            // 打开SFTP传输通道
            sftpChannel = (ChannelSftp) sftpSession.openChannel("sftp");
            sftpChannel.connect();

            // 直接将Blob流上传到SFTP,边下载边传输
            sftpChannel.put(blobInputStream, sftpTargetFullPath);
            logger.log(Level.FINE, "文件传输完成,SFTP目标路径:" + sftpTargetFullPath);
        } catch (Exception e) {
            logger.log(Level.SEVERE, "文件传输失败", e);
            // 自定义异常处理逻辑
        } finally {
            // 释放SFTP资源
            if (sftpChannel != null && sftpChannel.isConnected()) {
                sftpChannel.disconnect();
            }
            if (sftpSession != null && sftpSession.isConnected()) {
                sftpSession.disconnect();
            }
        }
}

核心说明

  • 全程通过BlobClient.openInputStream()读取Azure Blob数据,直接传递给SFTP的写入方法,不会在本地磁盘生成临时文件
  • 流传输机制不会将整个文件加载到内存,支持大文件传输场景
  • try-with-resources会自动关闭Blob输入流,避免资源泄漏

注意事项

  • 如果SFTP使用密钥认证,可将setPassword逻辑替换为jsch.addIdentity("本地私钥文件路径")即可
  • 大文件传输场景可自行调整JSch的缓冲区参数,优化传输效率
  • 生产环境建议增加传输重试、进度监控、断点续传等逻辑提升稳定性

内容的提问来源于stack exchange,提问作者SarangRN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:42:04