使用代理下载私有Blob图像?

时间:2016-04-21 05:19:08

标签: azure asp.net-web-api azure-storage azure-storage-blobs

我目前通过公开 blob网址

访问我网站上的图片
https://subscription_name.blob.core.windows.net/users/5/drivers_licence.jpg

我想将blob访问权限从公共更改为私有,并将网址更改为:

http://localhost:3000/users/5/drivers_licence.jpg

Blob Url是从数据库中存储和提取的,因此我可以运行查询来使用新前缀(localhost one)更新所有记录,这很容易。

问题是:我如何实现代理,以便当我单击下载链接时,它会在一个空白页面中打开文档,其中包含新的localhost网址?

localhost仅用于测试目的。我最终会用我的域名替换它:

https://website-name.com/users/5/drivers_licence.jpg

稍后编辑我想出来了,我发布了解决方案作为下面的答案

3 个答案:

答案 0 :(得分:2)

如果您担心安全性并希望将容器的ACL保持为私有(BTW绝对是正确的事情),那么您可以做的是使用{{1}在blob上创建Shared Access Signature (SAS)许可和短期到期。要进一步保护SAS,可以在SAS上应用IP ACL。使用IP ACL,即使用户与其他用户共享SAS URL,如果IP地址与SAS中配置的IP地址不同,则其他用户将无法访问该URL。

如果您担心不公开存储帐户端点,可以按照@ forester123的说明将自定义域映射到Blob存储端点。

如果您想通过网站域提供blob,唯一的解决方案是首先从Web服务器上的存储中下载blob,然后从那里提供Blob。举个例子,我假设容器名称为Read,并且每个用户都有虚拟文件夹。在这种情况下,您需要做的是在您的网站中创建一个名为users的文件夹,并在那里下载blob并将其保存为本地文件。保存文件后,可以通过您的网站URL访问它们。

但是我不推荐这种方法,因为它效率不高。您需要先将blob从存储中下载到本地服务器并从那里进行服务。此外,每个服务器都可以限制您可以保存多少本地数据,如果您不经常清理文件,则可能会耗尽磁盘空间。

我的建议是查看共享访问签名。您可以在此处详细了解:https://azure.microsoft.com/en-in/documentation/articles/storage-dotnet-shared-access-signature-part-1/

答案 1 :(得分:0)

您可以尝试为Blob存储端点配置自定义域名,查看详细信息here

答案 2 :(得分:0)

所以这就是我所寻找的,以防其他人正在寻找类似的解决方案:

public class BlobController : ApiController {

    private readonly BlobHelper helper = new BlobHelper();

    [Route("api/blob/{container}/{*filename}")]
    public HttpResponseMessage BlobDownload(string container, string filename) {
        var httpResponseMessage = new HttpResponseMessage();

        // 1) check if parameters are set

        // 2) try and get the blob
        var blob = helper.DownloadBlob(container, filename);

        // 3) check the response to see if blob actually exists

        // 4) return the file
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        httpResponseMessage.Content = new ByteArrayContent(blob.Stream);
        // don't forget to set the content type, this is important in order to mimic the described behaviour (IE: display an image in the browser)
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(blob.ContentType); 

        return httpResponseMessage;
    }
}