2017-05-29 209 views
3

我從一個URL如何設置一定的響應頭下載我的文件強制瀏覽器從URL

所需的響應頭下載一個CSV文件,下載文件爲CSV:

HTTP/1.1 200 OK 
Date: Mon, 29 May 2017 06:03:38 GMT 
Content-Type: application/octet-stream 
Content-Length: 340 
Connection: keep-alive 
Expires: Tue, 03 Jul 2001 06:00:00 GMT 
Last-Modified: Mon May 29 11:33:38 IST 2017 
Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Disposition: attachment; filename="5756913MerchantTransactionFile20170529113338.csv" 
Server: Some 
Access-Control-Allow-Origin: 
Access-Control-Allow-Origin: 
authorized: true 
authorizehtml: true 

電流響應頭

HTTP/1.1 200 OK 
Date: Mon, 29 May 2017 06:16:52 GMT 
Server: Apache/2.4.18 (Unix) PHP/5.5.36 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT 
Access-Control-Max-Age: 1000 
Access-Control-Allow-Headers: x-requested-with, Content-Type, origin, authorization, accept, client-security-token 
Expires: Tue, 03 Jul 2001 06:00:00 GMT 
Last-Modified: Mon May 29 11:46:52 IST 2017 
Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Type: application/json 
Content-Length: 0 
Keep-Alive: timeout=5, max=97 
Connection: Keep-Alive 

我的代碼:

openFile(url) { 
var xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 

    } 
}; 
xhttp.open("GET",url, true); 
xhttp.send(); 
    //window.open(url, '_blank') 
} 

試圖從url下載csv文件。請幫助我。我們如何強制瀏覽器下載文件。

+3

你是如何服務他應該csv文件?響應頭只能由響應代理設置。 –

+1

**響應**標題是**服務器**告訴您的客戶端。只有您可以從客戶端更改的內容是可能會導致不同響應的**請求**標頭。 –

回答

2

這裏的訣竅是將您的數據轉換爲blob並模擬blob url錨點標記上的點擊事件。

var blob = new Blob([content]);

創建點擊事件

var evnt = new Event('click'); 

然後創建一個錨標記如下調度事件

$("<a>", { 
    download: filename, 
    href: webkitURL.createObjectURL(blob) 
    }).get(0).dispatchEvent(evnt); 

這裏是一個功能

var download = function(filename, content) { 
    var blob = new Blob([content]); 
    var evnt = new Event('click'); 

    $("<a>", { 
    download: filename, 
    href: webkitURL.createObjectURL(blob) 
    }).get(0).dispatchEvent(evnt); 
}; 

使用上述下載功能。

用法:調用函數與下載兩個參數filenamecontent

openFile(url) { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function(data) { 
    if (this.readyState == 4 && this.status == 200) { 
     download('file.csv', data); 
    } 
    }; 
    xhttp.open("GET", url, true); 
    xhttp.send(); 
    //window.open(url, '_blank') 
} 
+0

爲什麼選擇自定義事件? (這並不是說你創建一個的方式已被棄用,而且你甚至不會正確地初始化它)。爲什麼在你有'xhr.responseType ='blob''選項時從xhr響應中創建一個Blob?那些不支持'Anchor.download'屬性的瀏覽器呢? – Kaiido

+0

感謝您的更新,我添加了新的方法來添加事件。此外,這種方法並不僅限於'xhr',它可以採用正常的文本內容並幫助下載它。這就是爲什麼在功能裏面的blob轉換。這種方法適用於大多數較新的主要瀏覽器,它有73%的使用率,而且問題不是瀏覽器特定的。 –

-1

你應該指定正確發出請求時,接受頭。然後,服務器作爲響應,將放置正確的Content-Type標頭。在你的情況下,你應該添加此行創建XMLHttpRequest時:

xhttp.setRequestHeader("Accept", "text/csv; charset=utf-8"); 
+0

這不是一個接受'text/csv'的問題,而是一個強制下載對話框的問題,這個問題是由Content-Disposition響應頭造成的。 –

+0

對我不起作用 – meena

+0

@Vivek,沒有提及對話。只有關於錯誤響應標題的問題。請求者嘗試修正服務器的標題。我提供了可能的解決方這是一個指定Content-Disposition標頭和Content-Type的服務器。 –