类似于“Content-disposition”的Javascript行为

4

我想知道是否可能仅通过使用客户端javascript使浏览器的行为与它在看到“Content-disposition: attachment; filename=…”时所做的一样?这意味着要保存的文件的数据仅在客户端上可用。

也就是说,假设我们有一个javascript数组,仅在客户端上,

var data = [
              ["aa","bb","cc","dd","ee","ff","gg","hh","ii"]
              [ 1,   2,   3,   4,   5,   6,   7,   8,   9],
              ..
           ];

我想将这个数组保存为文本文件到用户的电脑上。必须提示用户输入文件名(即,我不想绕过浏览器的安全设置或其他任何设置)。

如果不将数组存储到服务器的临时文件并发出另一个请求以获取此临时文件,则是否可行?如果没有简单的答案,任何想法、谷歌关键字或链接都将不胜感激。


我可以提议将这个数组保存在一个 cookie 中吗? 如果可以的话,我可以给你代码 :) - Marwan
不,这需要是用户文件系统中的真实文件,以便用户稍后可以打开它并可能编辑其内容等。 - Vera
Cookie 简直行不通 - 它们只能从浏览器中获取。我不能告诉用户去“工具”->“选项”->“隐私”->“管理 Cookie”来获取他的数据。 - Vera
4个回答

1
var YourTextData = "text data here";
window.location.href = "data:application/octet-stream," + encodeURIComponent(YourTextData);

很棒,但似乎没有IE或Safari兼容的方法来设置文件名,这可能会成为许多人的绊脚石。请参见https://dev59.com/TXVC5IYBdhLWcg3wdw-5和http://caniuse.com/#feat=download - tuomassalo

1
你不能用纯JavaScript解决这个问题 - 你需要从服务器获取文件推送。
但是你不必在服务器上拥有一个“物理”文件来完成这个任务。你可以将数据字符串存储在内存中,并从内存写入响应流。但是如果不告诉我们你正在使用哪种服务器端技术,就无法得到更详细的回答。

谢谢您的回复。我正在使用.Net 4/C#,但我没有使用UpdatePanel或其他针对.Net的ajaxified控件。另一个第三方JS框架正在使用(如果这很重要)。 问题是目前我有一些Javascript在显示数据之前添加“最后的修饰”。 “另存为”(平面文件)需要以可解析格式保存用户所看到的内容,因此,“打印”并将其打印到*.esp不适用于我。 - Vera
从技术上讲,我可以在服务器上实现已经存在于Javascript中的类似代码/算法。唯一的问题是 - 这是相同功能的两个实现,这总是很麻烦。 - Vera
你应该在服务器端进行所有数据处理,只在客户端呈现。除非你通过前端进行排序和分页,那么你基本上必须在代码后台做同样的事情。然后很容易使用 Response.BinaryWrite() 将 MemoryStream 的内容输出。例如,请参考:http://www.c-sharpcorner.com/UploadFile/jhblankenship/DownloadingFromMemStream11262005060834AM/DownloadingFromMemStream.aspx。 - Kon
很遗憾,我没有决定在哪里进行最终数据操作。此外,就像我说的那样,这不是实际的数据操作,而是对数据的最后修饰 - 值格式化等等。客户端实现不能被删除(要求)。 如果您确定没有办法强制浏览器为客户端数据(或通过AJAX调用接收到的数据)打开“另存为”对话框,那么是的,我将不得不有两个相同逻辑的实现。幸运的是,它已经在服务器上实现了,只需要插入即可。 - Vera
理论上,您可以通过使用隐藏的iframe来模拟它,也许这会有所帮助 - http://richard.gluga.com/2009/05/2-stage-ajax-file-download-with-yui.html 但我认为如果您只是在服务器端完成这个任务,那么会更简单(因此开发速度更快,维护也更容易)。 - Kon

1
据我所知,你无法以任何跨浏览器的方式使用Javascript来很好地完成这个任务。
如果你真的不想使用服务器,你可以使用Flash制作一个混合解决方案。基本上,你需要制作一个自定义的Flash控件,通过Javascript(ExternalInterface)与其通信,然后Flash控件将启动“文件保存”操作。
这里有一篇关于这个主题的文章:使用Flash Player 10本地保存文件

1

看一下下载ify:它使用了@Adam建议的技术


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接