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

Spring Boot集成Azure SDK上传大文件到Azure存储账户末尾出现多余字符如何解决

问题修复方案

该问题是你当前使用的azure-storage-blob:12.12.0版本的已知缺陷,叠加手动排除reactor依赖导致的版本兼容问题共同导致,2GB是触发该bug的阈值,因此1.33GB文件上传正常、2.22GB文件出现异常。可通过以下步骤修复:

  • 第一步:升级Azure存储SDK依赖
    azure-storage-blob 12.12.0为2021年发布的旧版本,官方已经在后续版本修复了大于2GB文件分块上传时的末尾字符追加bug。建议直接升级到最新稳定版,同时移除pom.xml中对reactor-core、reactor-netty的手动排除和版本锁定,使用Azure SDK自带的配套依赖版本即可,避免版本不匹配带来的兼容问题。
    如果你必须保留当前Spring Boot 2.5.2版本,建议至少将azure-storage-blob升级到12.14.0及以上,可引入azure-sdk-bom统一管理所有Azure相关依赖的版本,无需手动排包。
  • 第二步:优化上传代码逻辑
    你当前使用的基础upload方法校验逻辑较弱,可调整为uploadWithResponse接口,手动指定分块参数和覆盖规则,避免分块上传逻辑出错:
    private boolean upload(final MultipartFile file) throws IOException {           
        BlobClientBuilder blobClientBuilder = new BlobClientBuilder();
        blobClientBuilder.endpoint(STORAGE_URL).connectionString(storageConnectionString);          
        blobClientBuilder.containerName(CONTAINER_NAME);
        BlobClient blobClient = blobClientBuilder.blobName(file.getOriginalFilename()).buildClient();
        
        ParallelTransferOptions transferOptions = new ParallelTransferOptions()
                // 手动指定分块大小为4MB,避免默认分块逻辑在2GB阈值附近出错
                .setBlockSizeLong(4 * 1024 * 1024L);
        BlobUploadOptions uploadOptions = new BlobUploadOptions()
                .setInputStream(file.getInputStream())
                .setLength(file.getSize())
                .setOverwrite(true)
                .setParallelTransferOptions(transferOptions);
        
        blobClient.uploadWithResponse(uploadOptions, null, null);
        return blobClient.exists();
    }
    
  • 第三步:增加完整性校验(可选)
    可提前计算本地源文件的MD5值,上传时传入Content-MD5请求头,Azure存储端会自动校验文件完整性,校验不通过会直接返回错误,避免脏数据写入。
    如果调整后仍有问题,可先校验前端上传拿到的MultipartFile流和本地源文件的MD5是否一致,排除前端上传环节的流损坏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03