HTTP标头使浏览器显示“另存为”对话框并保存文件

时间:2014-05-05 11:10:39

标签: javascript http https http-headers

在我的FCGI应用程序中,我希望以一种方式使服务器端响应,使浏览器(想要使用其中的大多数)打开"另存为"对话框,实际上将文件保存在用户硬盘上。 我失败了(这个) 以下是从Chrome收到的请求/回复转储:

Remote Address:192.168.1.69:80  
Request URL:http://192.168.1.69/sunprint/sunweb.fcgi?GETPCBSDATAASFILE2SAVE  
Request Method:GET  
Status Code:200 OK

Request Headers  
GET /sunprint/sunweb.fcgi?GETPCBSDATAASFILE2SAVE HTTP/1.1  
Host: 192.168.1.69  
Connection: keep-alive  
Accept: */*  
X-Requested-With: XMLHttpRequest  
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   >Chrome/34.0.1847.116 Safari/537.36
Referer: http://192.168.1.69/sunprint/PCBsVersions.html  
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4  

Query String Parameters  
GETPCBSDATAASFILE2SAVE  

Response Headers  
HTTP/1.1 200 OK  
Date: Mon, 05 May 2014 10:21:23 GMT  
Server: Apache/2.2.22 (Ubuntu)  
Cache-Control: no-cache, must-revalidate  
Expires: Mon, 26 Jul 1997 05:00:00 GMT  
Content-Description: File Transfer  
Content-Disposition: attachment; filename="SunSerialNumbers.txt"  
Vary: Accept-Encoding  
Content-Encoding: gzip  
Content-Length: 227  
Keep-Alive: timeout=5, max=81  
Connection: Keep-Alive  
Content-Type: text/plain  

我的文件内容是一些可打印的ASCII符号。顺便说一下,我应该以某种方式对内容进行编码吗?

似乎所有需要的标题都存在,但浏览器仍然拒绝显示所需的对话框。是否存在错误的标题组合?

要发出请求,请使用以下代码:

  

function sendCommandGetFile(url1){
        $阿贾克斯({
            url:url1,
            键入:" GET"
        });
        }

     

sendCommandGetFile(" sunweb.fcgi?GETPCBSDATAASFILE2SAVE",function(data){});

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  

X-Requested-With: XMLHttpRequest

没有一组HTTP标头会导致浏览器下载它为响应使用XHR的请求而获取的文件。

您有三个基本选项。

  1. 首先不要使用XHR
  2. 将文件数据存储在某处,为其提供临时URI,在响应中传回URI,让客户端JS将location设置为该URI
  3. 构造一个data:方案URI,并让客户端JS将其分配给location
  4. 除非您确实需要有时返回一个文件,并且有时会返回JS处理的数据(例如错误消息),否则选项1是最好的。