0

问题:从数据生成的 csv 文件的 zip 文件在上传到 Azure Blob 存储后似乎已损坏。

上传前的 zip 文件如下所示:

在此处输入图像描述

一切正常。上传后的同一个 zip 文件已损坏,如下所示: 在此处输入图像描述

在上传期间,我使用适用于 Java 的 Azure Storage Blob 客户端库(v. 12.7.0,但我也尝试过以前的版本)。这是我使用的代码(类似于SDK 自述文件中提供的示例):

public void uploadFileFromPath(String pathToFile, String blobName) {
     BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
     blobClient.uploadFromFile(pathToFile);
}

我得到上传的文件:

在此处输入图像描述

当我直接从存储资源管理器下载文件时,文件已经损坏。我做错了什么?

4

2 回答 2

1

根据您的描述,我建议您使用以下方法上传您的 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);

更多详细信息,请参阅文档

于 2020-06-26T06:30:14.837 回答
0

最后是我的错。在上传文件之前我没有关闭 ZipOutputStream。当您使用资源尝试并只想生成本地文件时,这不是什么大问题。但就我而言,我想将文件上传到 Blob 存储(仍在尝试部分)。文件不完整(未关闭),因此它出现在数据损坏的存储中。这是我从一开始就应该做的。

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。我非常感谢。

于 2020-06-26T10:41:31.180 回答