如何在不通过java服务下载的情况下在浏览器上打开blob?

时间:2017-07-20 08:57:13

标签: java azure logic

我正在创建一个应用程序,我需要在浏览器中查看blob而不是下载它们。目前,具有令牌的blob链接会下载相应的blob。

我在这里有一些参考来查看浏览器中的blob: https://github.com/Azure-Samples/storage-blob-java-getting-started/blob/master/src/BlobBasics.java (参见第141行)

以下是我创建令牌的代码:

@Test
    public String testBlobSaS(CloudBlob blob, CloudBlobContainer container) throws InvalidKeyException,
            IllegalArgumentException, StorageException, URISyntaxException, InterruptedException {
        SharedAccessBlobPolicy sp = createSharedAccessBlobPolicy(
                EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.LIST), 100);
        BlobContainerPermissions perms = new BlobContainerPermissions();
        perms.getSharedAccessPolicies().put("readperm", sp);
        perms.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
        container.uploadPermissions(perms);
        String sas = blob.generateSharedAccessSignature(sp, null);
        CloudBlockBlob sasBlob = new CloudBlockBlob(
                new URI(blob.getUri().toString() + "?" + blob.generateSharedAccessSignature(null, "readperm")));
        sasBlob.download(new ByteArrayOutputStream());
        CloudBlob blobFromUri = new CloudBlockBlob(
                PathUtility.addToQuery(blob.getStorageUri(), blob.generateSharedAccessSignature(null, "readperm")));
        assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
                blobFromUri.getServiceClient().getCredentials().getClass().toString());
        StorageCredentials creds = new StorageCredentialsSharedAccessSignature(
                blob.generateSharedAccessSignature(null, "readperm"));
        CloudBlobClient bClient = new CloudBlobClient(sasBlob.getServiceClient().getStorageUri(), creds);
        CloudBlockBlob blobFromClient = bClient.getContainerReference(blob.getContainer().getName())
                .getBlockBlobReference(blob.getName());
        assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
                blobFromClient.getServiceClient().getCredentials().getClass().toString());
        assertEquals(bClient, blobFromClient.getServiceClient());
        return sas;
    } 

我已将此行添加到前面提供的url引用的代码中:

perms.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);

我的代码为我提供了blob的url,其标记为:

https://accountName.blob.core.windows.net/directories/blobName?token

仍然使用此网址,它正在下载相应的blob。 在创建令牌时我应该在代码中做出哪些更改,以便我可以在不下载的情况下在浏览器中查看blob?

2 个答案:

答案 0 :(得分:4)

您要检查的第一件事是blob的content-type属性。很有可能,blob的内容类型为application/octet-stream(这是默认的内容类型)。因此,浏览器不了解如何处理此blob并因此下载它。请尝试将blob的内容类型更改为适当的值(例如image / png),这样可以解决问题。

此外,我注意到您正在将容器的ACL设置为BlobContainerPublicAccessType.CONTAINER。如果您这样做,那么您无需创建共享访问签名(SAS)。您的blob只能通过其URL(https://accountname.blob.core.windows.net/containername/blobname)访问。当容器的ACL为Private时,SAS就会发挥作用。

答案 1 :(得分:1)

Blob有二进制数据,几乎可以是任何东西 - 图像,视频,文档等。 当你点击blob网址时,它类似于点击指向文件的任何网址。除非浏览器可以显示内容,否则浏览器的默认操作是下载文件。

评论(在浏览器中查看上传的blob ..)意味着要使blob公开显示,您需要设置适当的权限。设置这些权限后,您可以在浏览器中将网址粘贴到blob中,然后就可以访问了。

要允许公众访问容器,您可以使用以下代码 -

public static void SetPublicContainerPermissions(CloudBlobContainer 
container)
{
    BlobContainerPermissions permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}

您可以在doucmentation

中找到有关管理blob访问权限的更多信息