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
相关产品推荐
相关产品推荐

