强制浏览器从URL

问题描述:

我从一个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

**响应**标题是**服务器**告诉您的客户端。只有您可以从客户端更改的内容是可能会导致不同响应的**请求**标头。 –

这里的诀窍是将您的数据转换为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%的使用率,而且问题不是浏览器特定的。 –

你应该指定正确发出请求时,接受头。然后,服务器作为响应,将放置正确的Content-Type标头。在你的情况下,你应该添加此行创建XMLHttpRequest时:

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

这不是一个接受'text/csv'的问题,而是一个强制下载对话框的问题,这个问题是由Content-Disposition响应头造成的。 –

+0

对我不起作用 – meena

+0

@Vivek,没有提及对话。只有关于错误响应标题的问题。请求者尝试修正服务器的标题。我提供了可能的解决方这是一个指定Content-Disposition标头和Content-Type的服务器。 –