java - 如何在浏览器上打开blob而不通过java服务下载?

标签 java azure logic

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

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

这是我创建 token 的代码:

@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);

我的代码为我提供了带有 token 的 blob url,例如:

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

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

最佳答案

您要检查的第一件事是 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 就会发挥作用。

关于java - 如何在浏览器上打开blob而不通过java服务下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45209985/

相关文章:

java - 将自定义字母特殊标记组合替换为文件中的文本

java - 如何使用计数器创建不同的 xml 标签?

postgresql - kubernetes timescaledb statefulset : Changes lost on pod recreation

azure - Azure API 无法识别来自 Terraform 的服务主体

c - boolean 表达式求值器错误

java - 从另一个类调用时更改 TextView 的函数不起作用

java - 如何将 "<pre>"标记包装在 java String 中的空格周围?

azure - 将滚动文件上传到 Azure Blob

algorithm - 合并冲突选项的实用方法

java - 为什么此代码有 "one off error"?