我目前通过公开 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
稍后编辑我想出来了,我发布了解决方案作为下面的答案
答案 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;
}
}