如何让浏览器提示用户保存服务器动态生成的文件?

 宝宝壮壮妈 发布于 2023-02-08 18:39

客户端使用jquery ajax提交post请求,如下所示:

$.ajax({
    url: "/xxx?request1", 
    data: theParams,
    type: 'post',
    error: function(XMLHttpRequest, textStatus, errorThrown){
        // error handling
    },
    success: function(data){
    var theResult = JSON.parse(data);
        // success handling
    }
});

Apache配置为将请求传递/xxx?给自定义应用程序.应用程序处理请求并返回信息.通常,此信息以JSoN形式返回,并使用jquery/javascript显示在"成功处理"部分中.在编写JSON之前,应用程序会编写以下标头(然后通过apache返回):

HTTP/1.0 200 OK
Connection: close
Server: MyServer v. 0.826
Content-Type: text/html

我也有饼干工作,在200 OK线之后放置以下内容:

Set-Cookie: cookie_name=value; Domain=example.com; Path=/; Expires=Fri, 21-Mar-2014 01:40:22 GMT; HttpOnly

在一种情况下,我希望用户能够保存返回的数据(作为纯文本文件).但这是我遇到问题的地方.

如果我使用JavaScript打开一个窗口并将数据写入新窗口,我发现Safari和Chrome都禁用了"另存为..."菜单选项(在Mac上).

(我有一个使用base64 URI工作的版本,但相对于网站的其他部分,它看起来没有抛光.)

然后我开始尝试包含Content-Disposition: attachment; filename=file.txt 标题,但我永远不会让浏览器产生提示.我尝试将此标题放在200 OK行之后,以及之后:

Content-Type: text/plain
Content-Disposition: attachment; filename=file.txt

除了不确定Content-Disposition标题的确切格式之外,我还不确定我是否有Content-Type正确的或者ajax处理程序代码中有什么东西阻止了保存.

我试图找到将所有东西放在一起的例子,但是只能找到零件而且我无法正确地将它放在一起.有什么建议?

我的目标只是现代浏览器,三个主要平台(Mac/Windows/Linux),客户端只有HTML5/JavaScript.

1 个回答
  • Content-Disposition: attachment是正确的标题,但浏览器只在直接加载文件时服从它.使用AJAX(甚至通过jQuery)将无法正常工作.

    有一种方法可以做到这一点.阅读这个答案的完整解释,但基本上你只需要在你的success函数中写下:

    window.location = "data:application/octet-stream," + encodeURIComponent(theResult);
    

    编辑: FileSaver.js提供了一个包装器,提高了浏览器兼容性,并为兼容的浏览器添加了对文件名的支持:

    var blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"});
    saveAs(blob, "hello world.txt");
    

    2023-02-08 18:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有