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

使用Azure Blob Java SDK下载含中文文件名的Blob并保留UTF-8编码

解决Azure Blob中文文件名下载乱码并保留原名称的方案

本地文件下载

直接使用downloadToFile出现中文乱码,是因为Windows系统默认编码可能非UTF-8,导致文件名解析错误。可以通过手动处理文件流规避该问题,直接读取Blob输入流并写入指定中文路径文件,确保文件名编码正确。

示例代码:

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.models.BlobItem;
import java.io.FileOutputStream;
import java.io.InputStream;

// 获取Blob客户端
BlobClient blobClient = containerClient.getBlobClient(blobItem.getName());
String localFilePath = "C:/check/项目.xlsx";

// 通过输入流下载并写入文件
try (InputStream blobInputStream = blobClient.openInputStream();
     FileOutputStream outputStream = new FileOutputStream(localFilePath)) {
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = blobInputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
} catch (Exception e) {
    e.printStackTrace();
}

这种方式绕开downloadToFile的底层编码问题,通过流操作确保中文文件名被正确识别,同时保留原名称。

下载到Azure文件共享

若要将Blob内容下载到Azure文件共享,需使用Azure Storage File Share客户端库,同样通过流操作确保中文文件名正常保存。

首先引入Maven依赖(使用最新稳定版本):

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-file-share</artifactId>
    <version>12.17.0</version>
</dependency>

示例代码:

import com.azure.storage.blob.BlobClient;
import com.azure.storage.file.share.ShareClient;
import com.azure.storage.file.share.ShareFileClient;
import com.azure.storage.file.share.ShareClientBuilder;
import java.io.InputStream;

// 初始化文件共享客户端
ShareClient shareClient = new ShareClientBuilder()
        .connectionString("你的Azure文件共享连接字符串")
        .shareName("你的文件共享名称")
        .buildClient();

// 获取Blob客户端和目标文件路径(含中文文件名)
BlobClient blobClient = containerClient.getBlobClient(blobItem.getName());
String shareFilePath = "/目标文件夹/项目.xlsx"; // 文件共享中的路径

// 创建文件客户端并上传流
ShareFileClient shareFileClient = shareClient.getShareFileClient(shareFilePath);
// 根据Blob大小创建文件(若文件不存在)
shareFileClient.create(blobClient.getProperties().getBlobSize());

// 将Blob输入流写入文件共享的文件
try (InputStream blobInputStream = blobClient.openInputStream()) {
    shareFileClient.upload(blobInputStream, blobClient.getProperties().getBlobSize());
} catch (Exception e) {
    e.printStackTrace();
}

关键说明

  • 避免使用URLEncoder编码文件名,防止原名称被修改;直接操作流的方式可确保文件名在本地或Azure文件共享中以原中文名称保存。
  • 本地下载时,现代Java版本(8+)的FileOutputStream已支持UTF-8编码文件名,流操作方式稳定性更强。
  • Azure文件共享本身支持UTF-8编码文件名,创建ShareFileClient时传入正确中文路径即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:35:00