我正试图从流中直接上传一个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,那么相同的流就能正常工作。
发布于 2016-11-23 06:01:56
我试图复制你的问题,但失败了。根据您的代码,似乎唯一明显缺少的事情是在通过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();如果你能更新更多的细节,我认为这有助于分析这个问题。如有任何问题,请随时通知我。
https://stackoverflow.com/questions/40748705
复制相似问题