【问题标题】:How to open blobs on browser without downloading through java service?如何在不通过 java 服务下载的情况下在浏览器上打开 blob?
【发布时间】:2017-07-20 17:46:54
【问题描述】:

我正在创建一个应用程序,我需要在浏览器中查看 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

仍然使用此 url,它正在下载相应的 blob。 在创建令牌时我应该对代码进行哪些更改,以便我可以在浏览器本身中查看 blob 而无需下载?

【问题讨论】:

  • 下载意味着blob实际上保存在磁盘上,而不是显示在浏览器中。对吗?
  • 是的,它现在正在下载,但目前我们的要求是在浏览器本身中打开 blob.. 请建议更改代码..
  • 您在谈论两件不同的事情。 1 - 公开访问 blob 2 - 显示 blob 内容。通过下载内容并使用适当的应用程序查看或直接在浏览器中查看。
  • 嗨,请看一下这个:stackoverflow.com/questions/45279079/…

标签: java azure logic


【解决方案1】:

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

我还注意到您将容器的 ACL 设置为 BlobContainerPublicAccessType.CONTAINER。如果您这样做,则无需创建共享访问签名 (SAS)。只需通过其 URL (https://accountname.blob.core.windows.net/containername/blobname) 即可访问您的 blob。当容器的 ACL 为 Private 时,SAS 开始发挥作用。

【讨论】:

  • 谢谢。现在的问题是它没有打开 .docx 文件。它们必须下载..你能指导解决这个问题吗?
  • 你能问一个单独的问题吗?
  • 嗨,请看一下这个:stackoverflow.com/questions/45279079/…
【解决方案2】:

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

评论(要在浏览器中查看上传的 blob..)暗示的是,要使 blob 公开可见,您需要设置适当的权限。设置这些权限后,您可以将 url 粘贴到浏览器中的 blob 中,这样就可以访问了。

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

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

您可以在doucmentation 中找到有关管理对 blob 的访问权限的更多信息

【讨论】:

  • 感谢您的回答,有什么方法可以设置令牌以及在浏览器中查看 blob 的功能吗?
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2019-06-11
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多