使用BlobOutputStream在Azure中上载blob

时间:2016-11-22 18:04:17

标签: java azure azure-storage azure-storage-blobs

我尝试直接从流上传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例如

1 个答案:

答案 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();

如果您可以更新更多详细信息,我认为这有助于分析问题。如有任何疑虑,请随时告诉我。