我尝试直接从流上传blob,因为我不知道我决定使用this answer尝试的流的长度。
这不起作用,即使它从流中读取并且没有抛出任何例外情况,内容也不会上传到我的容器中。
我从文件上传没有问题,只有在从流上传时才会出现。
这是我的代码,我添加了一些内容来检查它是否正在阅读,但这不是问题所在:
try {
CloudBlockBlob blob = PublicContainer.getBlockBlobReference(externalFileName);
if (externalFileName.endsWith(".tmp")) {
blob.getProperties().setContentType("image/jpeg");
}
BlobOutputStream blobOutputStream = blob.openOutputStream();
int next = input.read();
while (next != -1) {
System.err.println("writes");
blobOutputStream.write(next);
next = input.read();
}
blobOutputStream.close();
return blob.getUri().toString();
} catch (Exception usex) {
System.err.println("ERROR " + usex.getMessage());
return "";
}
它没有失败,但它不起作用。
还有另一种方法吗?或者我错过了什么?
更新:我一直在检查,我认为问题出在InputStream本身,但我不知道为什么,因为如果我同样的流将工作正常用它来上传到亚马逊s3例如
答案 0 :(得分:1)
我尝试重现您的问题,但失败了。根据您的代码,似乎唯一明显缺失的事情是在通过blobOutputStream.flush();
关闭输出流之前没有调用blobOutputStream.close();
,但如果缺少flush
方法
以下是我的测试代码。
String STORAGE_CONNECTION_STRING_TEMPLATE = "DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;";
String accountName = "xxxx";
String key = "XXXXXX";
CloudStorageAccount account = CloudStorageAccount.parse(String.format(STORAGE_CONNECTION_STRING_TEMPLATE, accountName, key));
CloudBlobClient client = account.createCloudBlobClient();
CloudBlobContainer container = client.getContainerReference("mycontainer");
container.createIfNotExists();
String externalFileName = "test.tmp";
CloudBlockBlob blob = container.getBlockBlobReference(externalFileName);
if (externalFileName.endsWith(".tmp")) {
blob.getProperties().setContentType("image/jpeg");
}
BlobOutputStream blobOutputStream = blob.openOutputStream();
String fileName = "test.jpg";
InputStream input = new FileInputStream(fileName);
int next = -1;
while((next = input.read()) != -1) {
blobOutputStream.write(next);
}
blobOutputStream.close(); // missing in your code, but works if missing.
input.close();
如果您可以更新更多详细信息,我认为这有助于分析问题。如有任何疑虑,请随时告诉我。