Java中如何上传大于4MB的文件至Azure Storage作为AppendBlob
Azure Storage Blob Java SDK 大文件分块上传AppendBlob实现方案
你使用的12.14.1版本SDK确实没有内置AppendBlob的自动分块上传能力,需要手动拆分输入流处理,核心实现逻辑如下:
前置说明
- AppendBlob单块最大限制为4MB,单个AppendBlob最多支持追加50000个块,可根据实际文件大小调整单块大小,单块越大总块数越少,上传效率越高
- 分块时不需要提前加载整个文件到内存,直接从InputStream分批读取即可,避免出现OOM问题
实现步骤
- 初始化AppendBlobClient,若目标Blob不存在先调用
create()方法创建 - 定义单块缓冲区大小,默认推荐使用4MB(
4 * 1024 * 1024字节) - 循环从InputStream中读取数据到缓冲区,每次读满缓冲区就调用
appendBlock()方法上传,直到流读取完毕 - 最后一次读取如果数据不满缓冲区大小,直接上传剩余的有效字节即可
代码示例
import com.azure.storage.blob.specialized.AppendBlobClient; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; public class AppendBlobLargeFileUploader { // 单块大小设置为4MB,符合Azure基础限制 private static final int CHUNK_SIZE = 4 * 1024 * 1024; public void upload(AppendBlobClient appendBlobClient, InputStream fileInputStream) throws IOException { // 不存在则先创建AppendBlob if (!appendBlobClient.exists()) { appendBlobClient.create(); } byte[] chunkBuffer = new byte[CHUNK_SIZE]; int readBytesCount; try (fileInputStream) { while ((readBytesCount = fileInputStream.read(chunkBuffer)) != -1) { // 仅上传实际读取到的字节数,避免最后一块填充冗余空字节 appendBlobClient.appendBlock( new ByteArrayInputStream(chunkBuffer, 0, readBytesCount), readBytesCount ); } } } }
注意事项
- 需要断点续传的场景,可以记录已上传的块偏移量,下次上传时从对应位置开始读取流追加即可
- 上传过程中如果出现网络异常,可以捕获
BlobStorageException重试,SDK默认已启用内置重试策略,也可以在构建客户端时自定义重试参数 - 若需要更高的上传吞吐量,可以调整单块大小到最大100MB(12.14.1版本已支持该上限),但要注意总块数不能超过50000的限制
内容的提问来源于stack exchange,提问作者Jokkeri
相关产品推荐
相关产品推荐

