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());
.
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());
Azure 上的 blob 是 0 字节,但是当我更改为:
File file = new File("C://uploads//"+multipartFile.getOriginalFilename());
它开始正确保存文件
我在标题中面临的这个问题与之前在此处提出的问题 (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());
.
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());
Azure 上的 blob 是 0 字节,但是当我更改为:
File file = new File("C://uploads//"+multipartFile.getOriginalFilename());
它开始正确保存文件