2013-12-16 139 views
0

我正在使用Azure Blob存储,并且我希望用户能够下载文件。当用户点击他们想下载的文件时,我使用AJAX生成共享访问签名并返回从其下载的URL。那么有没有什么方法可以使用Javascript下载文件?或者是否有其他方法可以使用...我也希望它不能运行服务器端,因为当我应该能够直接从URL下载时,没有任何理由会产生不必要的成本...Javascript下载URL - Azure Blob存储

基本上,Dropbox是如何做到的......是否以某种方式提交某种形式?它甚至不必如此。

回答

1

如果我理解正确,您希望用户在单击SAS URL时看到Open/Save As提示。

假设我的理解是正确的,最近Windows Azure Storage宣布了一些增强功能。其中一项增强功能是添加了Content-Disposition blob属性,该属性允许此Open/Save As提示在用户单击blob的SAS链接时显示。随着Content-Disposition,你有两个选择:

  1. 设置Content-Disposition为BLOB属性:在这种情况下,每当SAS链路上的用户点击,他们将被提示保存文件。但在这种情况下,他们会总是被提示如此SAS链接与否,用户将永远无法在浏览器中看到文档内联。您可能会发现此链接对此有用:http://msdn.microsoft.com/en-us/library/windowsazure/ee691966.aspx
  2. 设置Content-Disposition作为SAS URL的一部分:在这种情况下,只有当用户点击包含Content-Disposition的SAS URL时才会提示用户。您可能会发现此链接对此有用:http://msdn.microsoft.com/en-us/library/windowsazure/dn140255.aspx

因此,假设你有一个PNG文件。在选项1中,它绝不会在浏览器中内联显示,它将被下载到客户机上,并在计算机上的注册图像查看器中打开。在选项2中,如果在SAS URL中设置了Content-Disposition,则图像文件将下载到客户端计算机上,并在计算机上的注册图像查看器中打开,否则它将直接显示在浏览器中。

如果您使用.Net,Storage Client library 3.0.0。0支持这个特性,所以你不必编写REST API的包装器(但是我认为你使用的是PHP ...)。

+0

你有什么想法为什么签名不符合新版本?如果$ version ='2012-02-12'它会生成一个好签名,但如果我将其更改为'2013-08-15',它表示签名不匹配。没有其他更改,但我没有看到有关更改如何为新版本构建签名的任何内容:http://msdn.microsoft.com/en-us/library/windowsazure/dn140255.aspx – Paul

+0

假设您'重新编写REST API封装,你是否包含了所有你正在构建'SignatureString'的新参数?请参阅您提到的链接中标题为“构建签名字符串”的部分。 –

+0

发布关于使用PHP和最新版本的REST API以及您正在使用的代码创建SAS URL的其他问题可能不是一个坏主意。我相信这会帮助很多人。 –

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"; 
+0

而顺便说一句,如果你使用jqueryfiledownload不要跳过cookie部分,否则它将无法正常工作! – BaNz

+1

我只是想补充一点,你和其他用户都很好 - 你的答案就是他的答案库 - 但问题出在Azure的内容分发标题上,正如Guarav的帖子中所述。然后,我利用jqueryfiledownload下载正确的URI与正确的SAS与正确的内容分发标题,它的工作奇迹:D – Paul

1

我这样做的方式在过去是通过打开一个隐藏的iframe与下载的网址。沿

var frame = document.createElement('iframe'); 
frame.src = url; // your Azure url 
frame.style.display = 'none'; 
document.body.appendChild(frame); 

请注意,你需要确保你也不要试图用一个不安全的下载要做到这一点安全(HTTPS)网页上线(HTTP)

东西

-1

我试过这样做是为了我的项目,不能得到'另存为'对话框出现。服务器端我已经尝试设置ContentDisposition设定为这样:

Blob.Properties.ContentDisposition = "attachment" 
Blob.SetProperties() 

客户端我已经给了用户访问BLOB像这样:

document.getElementById("downloadLink").innerHTML = "<a href=" + bloburi + ">" + bloburi + "</a>"; 

如果我点击这个链接的文件上打开浏览器窗口。我如何获得“另存为”对话框?