2012-08-31 141 views
1

我正在寻找一种方法将POST数据传输到后端脚本,用它来动态生成临时文件(临时性的,因为它是动态生成的,并未保存到服务器上的磁盘上),以及然后将其作为下载提供给客户端。通过AJAX强制下载

我有后端脚本运行良好。问题是我还没有找到通过AJAX调用获取下载提示的方法。

假如我不是POST ING的数据,我只想用这样的:

window.location.href = 'path/to/my/script.php'; 

是我后甚至有可能是?是否可以在不诉诸诸如动态地向DOM注入表单并提交它或者打开另一个浏览器窗口等的“黑客行为”的情况下完成?

+0

你可以改变表单的'目标'为一个隐藏的'iframe'然后提交?如果你正在处理任何视图状态信息(比如在ASP.NET中),你必须调用同一页面 – freefaller

+0

你想让当前页面像发布一个不可见的表单那样行事,但不想以“诉诸”具有不可见的形式,张贴。为什么? –

+0

@JonHanna:用户在构建成JS对象的UI上执行操作。当用户保存时,我想POST这个JS对象和一些其他相关的数据位,让服务器构造一个“文件”,然后提示客户端下载。 – FtDRbwLXw6

回答

4
  1. 发出POST请求;
  2. 创建资源;
  3. 回答资源路径;
  4. window.location.href = resourcePath
  5. [可选]想要从第三方下载获取此类资源?附上一个CSRF令牌,并且只有在CSRF检查通过的情况下才能使用该资源 - 否则恭喜你,您刚刚赢得了一只403只小狗!

如果资源具有正确的标题,浏览器会要求您使用特定的应用程序保存/打开它。 /所以。

+0

我在我的问题中提到,内容没有保存到服务器上的磁盘上。这将需要我运行清理crons和维护磁盘空间等。 – FtDRbwLXw6

+0

只需在GET上生成资源,如果需要的话使用一些特定的请求参数。 – BalusC

+0

@drrcknlsn我用RESTful的方式表示资源 - 稍后可以生成二进制答案 - 只需通过POST提供的内容保存到会话中,然后通过您在第一个答案中提供的标识进行重新计算。 – moonwave99

1

如果没有经典的表单提交,你就无法做到这一点,除非你能以某种方式通过GET进行下载。

但是,无论如何,这样做会是一个好主意,因为下载管理器等常常不适用于POST - 所以只需让您的脚本生成一个临时URL,然后使用您已发布的JavaScript重定向到该URL你的问题。