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

Java中如何上传大于4MB的文件至Azure Storage作为AppendBlob

Azure Storage Blob Java SDK 大文件分块上传AppendBlob实现方案

你使用的12.14.1版本SDK确实没有内置AppendBlob的自动分块上传能力,需要手动拆分输入流处理,核心实现逻辑如下:

前置说明

  • AppendBlob单块最大限制为4MB,单个AppendBlob最多支持追加50000个块,可根据实际文件大小调整单块大小,单块越大总块数越少,上传效率越高
  • 分块时不需要提前加载整个文件到内存,直接从InputStream分批读取即可,避免出现OOM问题

实现步骤

  1. 初始化AppendBlobClient,若目标Blob不存在先调用create()方法创建
  2. 定义单块缓冲区大小,默认推荐使用4MB(4 * 1024 * 1024字节)
  3. 循环从InputStream中读取数据到缓冲区,每次读满缓冲区就调用appendBlock()方法上传,直到流读取完毕
  4. 最后一次读取如果数据不满缓冲区大小,直接上传剩余的有效字节即可

代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:27:02