如何使用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
相关产品推荐
相关产品推荐

