上传后 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 的帮助。非常感谢。