上传后 Azure 存储 zip 文件损坏(使用 Java 的 Azure 存储 Blob 客户端库)
Azure Storage zip file corrupted after upload (using Azure Storage Blob client library for Java)
问题:从数据生成的带有 csv 文件的 zip 文件在上传到 Azure Blob 存储后似乎已损坏。
上传前的 zip 文件如下所示:
一切正常。上传后的同一个 zip 文件已损坏,如下所示:
在上传过程中,我将 Azure Storage Blob 客户端库用于 Java(v. 12.7.0,但我也尝试了以前的版本)。这是我使用的代码(类似于 SDK readme file 中提供的示例):
public void uploadFileFromPath(String pathToFile, String blobName) {
BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
blobClient.uploadFromFile(pathToFile);
}
我得到上传的文件:
当我直接从存储资源管理器下载文件时,文件已经损坏。
我做错了什么?
根据您的描述,我建议您使用以下方法上传zip文件
public void uploadFromFile(String filePath, ParallelTransferOptions parallelTransferOptions, BlobHttpHeaders headers, Map<String,String> metadata, AccessTier tier, BlobRequestConditions requestConditions, Duration timeout)
我们可以使用方法设置内容类型
例如
BlobHttpHeaders headers = new BlobHttpHeaders()
.setContentType("application/x-zip-compressed");
Integer blockSize = 4* 1024 * 1024; // 4MB;
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions(blockSize, null, null);
blobClient.uploadFromFile(pathToFile,parallelTransferOptions,headers,null, AccessTier.HOT, null, null);
详情请参考document
最后都是我的错。我在上传文件之前没有关闭 ZipOutputStream。当您对资源使用 try 并且只想生成本地文件时,这不是什么大问题。但就我而言,我想将文件上传到 Blob 存储(仍在 try 部分)。文件不完整(未关闭),因此它出现在包含损坏数据的存储中。这是我一开始就应该做的。
private void addZipEntryAndDeleteTempCsvFile(String pathToFile, ZipOutputStream zipOut,
File file) throws IOException {
LOGGER.info("Adding zip entry: {}", pathToFile);
zipOut.putNextEntry(new ZipEntry(pathToFile));
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.closeEntry();
file.delete()
}
zipOut.close(); // missing part
}
毕竟,感谢@JimXu 的帮助。非常感谢。
问题:从数据生成的带有 csv 文件的 zip 文件在上传到 Azure Blob 存储后似乎已损坏。
上传前的 zip 文件如下所示:
一切正常。上传后的同一个 zip 文件已损坏,如下所示:
在上传过程中,我将 Azure Storage Blob 客户端库用于 Java(v. 12.7.0,但我也尝试了以前的版本)。这是我使用的代码(类似于 SDK readme file 中提供的示例):
public void uploadFileFromPath(String pathToFile, String blobName) {
BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
blobClient.uploadFromFile(pathToFile);
}
我得到上传的文件:
当我直接从存储资源管理器下载文件时,文件已经损坏。 我做错了什么?
根据您的描述,我建议您使用以下方法上传zip文件
public void uploadFromFile(String filePath, ParallelTransferOptions parallelTransferOptions, BlobHttpHeaders headers, Map<String,String> metadata, AccessTier tier, BlobRequestConditions requestConditions, Duration timeout)
我们可以使用方法设置内容类型
例如
BlobHttpHeaders headers = new BlobHttpHeaders()
.setContentType("application/x-zip-compressed");
Integer blockSize = 4* 1024 * 1024; // 4MB;
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions(blockSize, null, null);
blobClient.uploadFromFile(pathToFile,parallelTransferOptions,headers,null, AccessTier.HOT, null, null);
详情请参考document
最后都是我的错。我在上传文件之前没有关闭 ZipOutputStream。当您对资源使用 try 并且只想生成本地文件时,这不是什么大问题。但就我而言,我想将文件上传到 Blob 存储(仍在 try 部分)。文件不完整(未关闭),因此它出现在包含损坏数据的存储中。这是我一开始就应该做的。
private void addZipEntryAndDeleteTempCsvFile(String pathToFile, ZipOutputStream zipOut,
File file) throws IOException {
LOGGER.info("Adding zip entry: {}", pathToFile);
zipOut.putNextEntry(new ZipEntry(pathToFile));
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.closeEntry();
file.delete()
}
zipOut.close(); // missing part
}
毕竟,感谢@JimXu 的帮助。非常感谢。