2015-04-01 19 views
11

我使用此代碼從服務器下載excel文件。使用blob從ajax結果下載文件

$.ajax({ 
    headers: CLIENT.authorize(), 
    url: '/server/url', 
    type: 'POST', 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(jsonData), 
    success: function (data) { 
     alert('Data size: ' + data.length); 
     var blob = new Blob([data], { type: "application/vnd.ms-excel" }); 
     alert('BLOB SIZE: ' + data.length); 
     var URL = window.URL || window.webkitURL; 
     var downloadUrl = URL.createObjectURL(blob); 
     document.location = downloadUrl; 
    }, 
}); 

的問題,我的經驗是,即使數據和斑點大小是相同的,那一刻document.location被分配提示我下載almoste兩次較大的Excel文件。當我嘗試打開它時,excel抱怨錯誤的文件格式,打開的文件包含大量垃圾,即使所需的文本仍然存在。

任何想法是什麼導致這一點,以及如何避免它?

+0

我不認爲這是一個好主意。爲什麼不讓服務器將文件推送到瀏覽器以獲得正常的下載流。這看起來非常不自然,除非你有一個非常具體的理由來做這件事,比如某種代理或者在線分析,但是它只是鞭策瀏覽器memeory。 – ppumkin 2015-04-01 14:36:34

+0

嘗試設置內容類型爲'arrayBuffer' – levi 2015-04-01 14:50:41

+0

@ppumkin,不幸的是我需要滿足要求。我無法在服務器上存儲文件,我需要通過授權標題才能獲取文件。 – SMart 2015-04-01 15:00:33

回答

27

所以我使用AJAX 2解決了這個問題。它本機支持二進制流。你不能使用jQuery,除非你base64編碼的一切,顯然。

工作的代碼如下所示:

var xhr = new XMLHttpRequest(); 
xhr.open('POST', '/le/url', true); 
xhr.responseType = 'blob'; 
$.each(SERVER.authorization(), function(k, v) { 
    xhr.setRequestHeader(k, v); 
}); 
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); 
xhr.onload = function(e) { 
    preloader.modal('hide'); 
    if (this.status == 200) { 
     var blob = new Blob([this.response], {type: 'application/vnd.ms-excel'}); 
     var downloadUrl = URL.createObjectURL(blob); 
     var a = document.createElement("a"); 
     a.href = downloadUrl; 
     a.download = "data.xls"; 
     document.body.appendChild(a); 
     a.click(); 
    } else { 
     alert('Unable to download excel.') 
    } 
}; 
xhr.send(JSON.stringify(jsonData)); 

希望這有助於。

+0

適用於鉻/ ff。對於IE,使用msSaveOrOpenBlob http://stackoverflow.com/questions/24007073/open-links-made-by-createobjecturl-in-ie11 – user2827377 2015-10-31 23:58:00

+2

這工作..我已經在Chrome上測試..在Safari它不:( – vasanth 2016-10-20 22:35:04

+0

+1 [this.response]如何獲得blob實際上,我正在嘗試像這樣window.URL.createObjectURL(xhttp.response) – 2017-06-20 17:01:47