我正在使用Azure Blob存储,我希望用户能够下载文件。当用户单击要下载的文件时,我使用AJAX生成共享访问签名并返回要从中下载的URL。那么我有什么方法可以使用Javascript下载文件吗?或者是否有其他方法我可以使用...我也希望它不会运行服务器端,因为当我应该能够直接从URL下载时没有理由产生不必要的成本......
基本上,Dropbox是如何做到的......它是以某种方式提交某种形式的吗?它甚至不必像那样。
答案 0 :(得分:3)
如果我理解正确,您希望用户在点击SAS网址时看到Open/Save As
提示。
假设我的理解是正确的,最近Windows Azure存储已经宣布了一些增强功能。其中一项增强功能是为blob添加了Content-Disposition
属性,允许在用户单击blob的SAS链接时显示此Open/Save As
提示。使用Content-Disposition
,您有两个选项:
Content-Disposition
设置为blob属性:在这种情况下,只要用户单击SAS链接,系统就会提示他们保存文件。但在这种情况下,他们会始终提示SAS链接与否,用户永远无法在浏览器中看到内联文档。您可能会发现此链接对此有用:http://msdn.microsoft.com/en-us/library/windowsazure/ee691966.aspx。Content-Disposition
设置为SAS网址的一部分:在这种情况下,只有用户点击包含Content-Disposition
的SAS网址时才会提示用户。您可能会发现此链接对此有用:http://msdn.microsoft.com/en-us/library/windowsazure/dn140255.aspx。假设你有一个png文件。在选项1中,它永远不会在浏览器中内嵌显示,它将在客户端计算机上下载并在计算机上的已注册图像查看器中打开。在选项2中,如果在SAS URL中设置了Content-Disposition
,则图像文件将在客户端计算机上下载并在计算机上的已注册图像查看器中打开,否则它将直接显示在浏览器中。
如果您使用的是.Net,则Storage Client库3.0.0.0支持此功能,因此您无需编写REST API包装器(但我认为您使用的是PHP ...关于CORS的问题:))。
答案 1 :(得分:2)
我过去做过这种方式的方法是打开隐藏的iframe和下载的网址。
的内容
var frame = document.createElement('iframe');
frame.src = url; // your Azure url
frame.style.display = 'none';
document.body.appendChild(frame);
请注意,您需要确保不要尝试使用不安全的下载(http)
在安全(https)页面上执行此操作答案 2 :(得分:1)
为避免重新加载/重定向,我使用此库:
http://jqueryfiledownload.apphb.com/
如果您需要帮助进行设置:http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
但是如果你想重定向用户,你可以使用基本的东西:
window.location.href = "http://stackoverflow.com/file.pdf";