2013-07-17 152 views
17

我想使用Javascript下載二進制文件。使用Javascript下載二進制文件

我有一個REST服務,返回二進制數據,我想知道它是否可能顯示二進制文件,無論文件擴展名爲何。

這是我當前的代碼:

var xhr = new XMLHttpRequest; 
xhr.open("GET", requestUrl); 
xhr.addEventListener("load", function() { 
    var ret = []; 
    var len = this.responseText.length; 
    var byte; 
    for (var i = 0; i < len; i++) { 
     byte = (this.responseText.charCodeAt(i) & 0xFF) >>> 0; 
     ret.push(String.fromCharCode(byte)); 
    } 
    var data = ret.join(''); 
    data = "data:application/pdf;base64," + btoa(data); 

    window.open(data, '_blank', 'resizable, width=1020,height=600'); 
}, false); 

xhr.setRequestHeader("Authorization", "Bearer " + client.accessToken); 
xhr.overrideMimeType("octet-stream; charset=x-user-defined;"); 
xhr.send(null); 

謝謝!

+1

這是什麼意思「顯示」? – Tommi

+0

你應該檢查這個答案:http://stackoverflow.com/questions/9620497/download-binary-data-as-a-file-via-javascript –

+0

你想下載的圖像只有?像png和jpegs一樣? –

回答

34

查看有關XMLHttpRequest的MDN文章。

如果設置了XMLHttpRequest到ArrayBuffer的響應,你可以做到以下幾點:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", requestUrl); 
xhr.responseType = "arraybuffer"; 

xhr.onload = function() { 
    if (this.status === 200) { 
     var blob = new Blob([xhr.response], {type: "application/pdf"}); 
     var objectUrl = URL.createObjectURL(blob); 
     window.open(objectUrl); 
    } 
}; 
xhr.send(); 

選項2:
您可以使用Blob作爲的XMLHttpRequest的響應。然後可能將其保存在文件系統(FileSystem API

它可能看起來像:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", requestUrl); 
xhr.responseType = "blob"; 

xhr.onload = function() { 
    onDownloaded(this); 
}; 
xhr.send(); 

方案3:
如果你只需要下載並「秀」的圖像,你可以很容易地做到這一點像這樣:

var img = new Image(); 

// add the onload event before setting the src 
img.onload = function() { 
    onImageDownloaded(img); 
} 

// start the download by setting the src property 
img.src = requestUrl 
+0

感謝您的回答。 但我的問題有點不同。我可以下載PDF或圖像,但是當我調用返回二進制數據的REST服務時,我不知道文件的類型是什麼。 –

+1

您可以在下載文件以獲取文件類型和文件名(用於UI)之前發出另一個請求。 –

+0

我正在處理它。謝謝 –