2013-02-13 57 views
3

這是一個以各種不同方式提出的常見問題,我收集了一些下面的鏈接並解釋了爲什麼它們不起作用。我正在尋找完整的解決方案以下。AJAX(或AJAX式)文件下載

在我開發有需要AJAX式的文件下列要求

  1. 用戶下載可以點擊鏈接下載文件並沒有被定向到一個新的頁面的Web應用程序,將會收到一個正常的「另存爲..」對話框,我們都習慣在網頁瀏覽器中下載文件
  2. 如果由於某種原因服務器無法提供文件,應該調用一個javascript回調函數。同樣地,如果服務器成功地擔任了該文件
  3. 需要能夠修改HTTP 請求頭指定,例如,在請求中的Content-Type HTTP頭
  4. 支持跨所有A優級瀏覽器

事情到目前爲止研究:

一個。 jquery.fileDownload通過使用表單提交,隱藏的iframe和讓服務器設置特定的cookie的組合,非常優雅地解決了需求1,2和4。我對這個項目非常熟悉(也貢獻了它)。要求3不受支持,因爲HTML表單提交和iframe(該庫使用的)不允許爲請求的服務器資源指定HTTP標頭。 (jdownloader也使用類似的iframe/form技術,但它也不解決要求3)。

b。它可以使用XMLHttpRequest的(各種黑客針對不同的瀏覽器(link 1link 2link 3link 4link 5link 6link 7link 8)從文件中檢索二進制數據,但他們沒有滿足要求1.二進制數據可以保存在一個javascript變量中,但無法調用瀏覽器的「另存爲...」對話框,以允許用戶將此二進制數據保存到其硬盤上的文件中

c。This link(under 「下載並保存到HTML5文件系統的文件」標題)有一個完整的端到端解決方案,使用XHR2並滿足要求1,2和3.但它得不到支持(u很新的HTML5 FileWriter)。

那裏有任何完整的解決方案?

編輯 我們有一些更多的選擇 - 我計劃測試。也許唯一的選擇是通過收集所有黑客/解決方案來爲這個問題開發一個庫,以創建一個通用的解決方案。

  1. 根據FIBERTECH的溶液如下:使用溶液(b)中保存文件到變量,然後:

    對於Internet Explorer:保存使用IE的的execCommand()

    對於其他這樣的數據:使用data urislink 2)和<的HTML5 下載屬性>標籤指定名稱(link 1link 2link 3link 4

  2. This link提到事做用帆布的文件下載能力

  3. Downloadify(和this link太)

  4. 一個看似相關link具有與網絡工作人員做的,而是做一些與Blob's和FileApi來生成文件。

回答

0

僅IE溶液:

function SaveContents(element) { 
    if (typeof element == "string") 
     element = document.getElementById(element); 
    if (element) { 
     if (document.execCommand) { 
      var oWin = window.open("about:blank", "_blank"); 
      oWin.document.write(element.value); 
      oWin.document.close(); 
      var success = oWin.document.execCommand('SaveAs', true, element.id) 
      oWin.close(); 
      if (!success) 
       alert("Sorry, your browser does not support this feature"); 
     } 
    } 
} 

必需HTML樣本:

<textarea id="myText"></textarea><br /> 
<button type="button" onclick="SaveContents('myText');">Save</button> 

這將給定textarea的內容保存到文件中與名稱等於textarea的ID 。

至於其他瀏覽器,你可以看到這一點:Does execCommand SaveAs work in Firefox?

測試案例和工作示例:http://jsfiddle.net/YhdSC/1/(即只..)

+0

所以將結合從溶液(B)我與原來的問題你IE技術和其他瀏覽器的數據URI解決了這個問題? – Hooloovoo13 2013-02-13 14:51:19