2010-09-02 221 views
3

看起来这个问题是定期问到的,常见的回答是“你不应该用AJAX做到这一点,只需将窗口位置设置为文件即可。”使用JS,jQuery,如何将AJAX响应保存到(文本)文件?

但我试图请求一个文件,实际上并不存在于服务器上的任何地方。它是在给定GET/POST上下文参数的情况下动态生成的(通过Django视图)。我想通过AJAX检索的文件,然后保存到客户机,是一个文本文件(csv)。

我目前可以将文本传送到客户端机器(并且可以通过在日志记录或警报中看到它进行验证),但无法弄清楚如何将此文本保存到AJAX成功回调函数fn中的文件中。

本质上,这是可能的,这是JS可以做的事情吗?也就是说,要打开实际上是AJAX响应文本的“文件”的文件保存对话框?

回答

0

出于安全原因,这不是JavaScript(因此jQuery或任何其他JS框架)允许执行的操作。你可能可以做你想要的flash或其他路线,但不能使用JavaScript。请记住,Flash也有其自身的一系列安全限制。

(是的,IE可以通过ActiveX对象做到这一点,但我没有计算,作为一个“解决方案”在这里)

+0

谢谢你不算IE/ActiveX作为解决方案......我也不会。看起来这对于JS来说并不是真的可能,我想避开Flash,其他MS或专有框架。所以我可能只是使用JS来包含,填充,然后完全在幕后提交HTML表单。 – 2010-09-03 15:56:53

0

基本上没有。由于安全限制,Javascript无法将任何内容保存到本地计算机。你最好的选择可能是让用户可以信任的签名小程序来编写文件,或者将它放在textarea中,然后他们可以轻松地复制并粘贴到新文件中。

+0

文本文件可能是CSV文件中原始数据的一个巨大(几MB)文本文件。尺寸根据用户选项而变化...但仍可能太大而无法剪切和粘贴。虽然之前我没有提到过......所以对于小文件,这可能是一个很好的解决方案。 – 2010-09-03 15:59:12

0

难道你不能使用这个PHP rename()函数,而不是仅仅使用Javascript?调用一个PHP文件,并将你想要复制的文件的名称和参数一起传递给它?

+0

号PHP在服务器上运行,而不是在浏览器中运行。 – 2010-09-03 00:17:28

+0

同意了,我以为我们一致认为JS不能完成任务,所以我提供了一个选择,因为其他人都做了,但感谢冰山反正,虽然它的东西,我已经知道了。 – d2burke 2010-09-03 00:27:58

+0

我在服务器端使用Django(所以Python)...所以我得看看是否有做同样的事情在Python的好方法。 – 2010-09-03 15:49:34

1

从浏览器的角度来看,文件是否存在并不重要,它只是它请求的服务器上的资源。我认为你将需要做一些版本的“只需将窗口位置设置为文件”。如果您将标题中的内容类型设置为浏览器无法识别的内容,我相信它会询问用户是否要保存它。

+0

我想我要做的就是通过JS模仿表单提交。我找到了一个这样做的jQuery插件。这不是很完美我想要什么,但我可以立足我对这个解决方案:http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/ – 2010-09-03 15:50:45

1

正如其他人所说,你不能只用JavaScript来完成。

IMO的最佳选择将是Flash 10+ FileReference API

有一些很好的JavaScript包装类库,如Downloadify提供了一个JavaScript API来访问这些方法。请参考demo

+0

我喜欢你的解决方案。 – 2010-09-03 07:55:35

+0

感谢CMS的信息。我认为你的解决方案效果很好(谢谢你提供了一个演示链接),但是我在这个项目的其他地方努力避免使用Flash。这主要是为了兼容iPhone ......但我猜iOS不会处理文件下载。嗯......我不得不多想一想这个。 – 2010-09-03 15:54:15

0

我有同样的问题。你可以试试这个

<button id="Save">Save</button> 
<img src="MakeThumbnail.ashx?Image=1.jpg" id="imgCrop"> 

$("#Save").click(function (e) { 
    url = $("#imgCrop").attr("src")+"&Action=Save" 
    e.preventDefault(); //stop the browser from following 
    window.location.href = url; 
});