Azure 存储 Blob:上传的 CSV 文件显示零字节

Azure Storage Blob: Uploaded CSV file shows zero bytes

我在标题中面临的这个问题与之前在此处提出的问题 (Azure storage: Uploaded files with size zero bytes) 非常相似,但它是针对 .NET 的,我的 Java 场景的上下文是我每天上传 small-size 个 CSV 文件(每个文件大约小于 5 Kb)。此外,API 代码使用了我正在使用的最新版本的 Azure API,与另一个问题使用的 2010 版本形成对比。

我不知道我错过了什么,但另一种选择是在文件存储中进行,但当然我的一些同行推荐了 blob 方法。

到目前为止,我的代码主要基于将文件作为 blob 块上传到 Azure 示例 git [页面] (https://github.com/Azure-Samples/storage-blob-java-getting-started/blob/master/src/BlobBasics.java) 中显示的示例。我已经完成了容器设置和文件重命名步骤,这不是问题,但是上传后,我 Azure 域上的 blob 存储容器中的文件大小显示为 0 字节。

我尝试交替将文件转换为 FileInputStream 并将其作为流上传,但它仍然产生相同的方式。

fileName=event.getFilename(); //fileName is e.g eod1234.csv
String tempdir = System.getProperty("java.io.tmpdir");
file= new File(tempdir+File.separator+fileName); //
try {
    PipedOutputStream pos = new PipedOutputStream();
    stream= new PipedInputStream(pos);
    buffer = new byte[stream.available()];
    stream.read(buffer);
    FileInputStream fils = new FileInputStream(file);
    int content = 0;
    while((content = fils.read()) != -1){
        System.out.println((char)content);
    }
    //Outputstream was written as a test previously but didn't work
    OutputStream outStream = new FileOutputStream(file);
    outStream.write(buffer);
    outStream.close();

    // container name is "testing1"            
    CloudBlockBlob blob = container.getBlockBlobReference(fileName);
    if(fileName.length() > 0){
       blob.upload(fils,file.length()); //this is testing with fileInputStream
       blob.uploadFromFile(fileName); //preferred, just upload from file
    }
}            

没有显示任何错误消息,只是我们知道文件涉及 blob 存储并显示大小为 0 字节。这是一个 one-way 过程,仅上传 CSV-format 个文件。在 blob 容器中,它应该显示每个大小为 1-5 KB 的上传文件。

而不是 blob.uploadFromFile(fileName); 你应该使用 blob.uploadFromFile(file.getAbsolutePath()); 因为 uploadFromFile 方法需要绝对路径。而且你不需要 blob.upload(fils,file.length());.

参考微软文档:https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-java#upload-blobs-to-the-container

Azure 团队回复了我在邮件中提出的相同查询,我已确认问题不在 API 上,而是由于 Vaadin 中的上传组件具有不同的行为通常(https://vaadin.com/blog/uploads-and-downloads-inputs-and-outputs)。 CloudBlockBlob 或 BlobContainerUrl 方法都有效。

开箱即用的上传组件需要手动将 FileOutputStream 实现为一个临时对象,这与随处可见的普通 servlet 对象不同。由于时间有限,我使用了他们的一个插件 EasyUpload,因为它集成了 Viritin UploadFileHandler 而不是弄清楚如何从头开始流式传输对象。如果有更多时间,我肯定会在我的沙盒工作区中试用 MultiFileUpload 插件,它有更多有趣的东西。

我在处理 .png(从多部分文件复制)文件时遇到了同样的问题我正在这样做:

File file = new File(multipartFile.getOriginalFilename());

A​​zure 上的 blob 是 0 字节,但是当我更改为:

File file = new File("C://uploads//"+multipartFile.getOriginalFilename());

它开始正确保存文件