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

