【问题标题】:Azure Storage Blob: Uploaded CSV file shows zero bytesAzure 存储 Blob:上传的 CSV 文件显示零字节
【发布时间】:2019-12-25 22:44:36
【问题描述】:

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

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

到目前为止,我的代码主要基于在 Azure 示例 git [页面] (https://github.com/Azure-Samples/storage-blob-java-getting-started/blob/master/src/BlobBasics.java) 中显示的示例上将文件作为 blob 块上传。我已经完成了容器设置和文件重命名步骤,这不是问题,但是上传后,我的 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 字节。这是一个单向过程,仅上传 CSV 格式的文件。在 blob 容器中,它应该显示这些上传的文件,每个文件的大小为 1-5 KB。

【问题讨论】:

  • 关于fils - 如果你按照我们在这里看到的那样运行它,难怪它的字节数为零。您正在阅读fils,直到其中没有剩余字节(返回-1,然后将其传递给上传方法。这意味着还有零字节要上传。您应该倒带或重新打开它。

标签: java azure vaadin


【解决方案1】:

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

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

【讨论】:

  • 是的,在完成的测试中比较了这两种方法后,它更直接了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2015-06-16
    • 2020-07-13
    • 2017-01-24
    • 2017-08-19
    相关资源
    最近更新 更多