问题:从数据生成的包含csv文件的zip文件在上传到Azure Blob存储后似乎已损坏。
上传前的zip文件如下所示:
在上传过程中,我使用了Azure Storage Blob client library for Java(12.7.0版,但我也尝试了以前的版本)。这是我使用的代码(类似于SDK自述文件中提供的示例):
public void uploadFileFromPath(String pathToFile, String blobName) {
BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
blobClient.uploadFromFile(pathToFile);
}
我得到了上传的文件:
当我直接从storage explorer下载文件时,文件已经损坏。我做错了什么?
最终是我的错。我没有在上传文件之前关闭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。我真的很感激。
根据您的描述,我建议您使用以下方法上传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);
有关详细信息,请参阅文件
我有一个Azure函数,当一个blob被上传到某个目录时会被触发。它处理一个zip文件。当我用Azure storage explorer将文件上传到容器时,它工作得非常好。当我通过网络API上传它时,它爆炸了。如果我下载了这个文件,它似乎已经损坏,但是,它与源文件大小相同,当我在2个文件之间进行超越比较时,它看起来是相同的(超越比较似乎可以看到zip文件的内容)。 这里是上传代码: 文件可以很好
我可以使用以下C代码将文件上载到azure blob存储, 这里我提供blob存储连接字符串和容器名称。 现在,我可以看到我在下有URL, 问题,我可以编写C代码,使用上面的URL上传文件,而不是使用连接字符串/容器名称吗?
我正在尝试使用将示例文档文件上载到azure存储blob。NET核心(V3.1)控制台应用程序,使用C#。我正在Visual Studio 2019本地运行控制台应用程序。 我有过 第一步:创建一个。NET核心控制台应用程序 步骤2:创建一个名为"file"的Azure存储帐户和容器。 步骤3:在本地计算机中创建word/pdf文档。 步骤4:初始化存储连接字符串,容器名称,文件路径 步骤5:在控
我想通过运行在Azure VM上的FTP服务器与用户共享Azure Blob存储中的文件。 据我所知,您不能在VM上挂载Blob存储,但可以使用“网络使用”挂载Azure文件共享。 Blob存储上的文件将以增量方式上载,因此理想情况下,我希望在上载时将其复制到Azure文件,Azure功能似乎是理想的方式,因为它们很容易为我设置和处理Blob存储上的触发器。 我如何使用Azure功能将文件从Blo
我相当愚蠢地上传了一个vhd到Azure文件存储,以为我可以从它创建一个虚拟机,却发现它真的需要在Blob存储中。 我知道我可以再上传一次,但它非常大,我的上传速度非常慢。 我的问题是-我可以将文件从文件存储移动到blob存储,而无需再次下载/上传吗?也就是说,Azure门户UI中是否有任何东西可以执行此操作,甚至是PowerShell命令?
我在尝试将文件上载到blob存储时遇到此错误。在本地主机上运行和在Azure函数中运行时都会出现错误。 我的连接字符串如下所示:DefaultEndpoint sProtocol=https; AcCountName=xxx; AcCountKey=xxx; Endpoint Suffix=core.windows.net 身份验证信息的格式不正确。检查授权标头的值。时间:2021 10月14日1