2013-12-16 134 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>"; 

如果我點擊這個鏈接的文件上打開瀏覽器窗口。我如何獲得「另存爲」對話框?