我有一个大表单,允许用户输入许多不同的字段,当它们完成后,我需要将表单的内容发送到服务器,处理它,然后吐出一个包含该文件的.txt文件.他们下载的处理结果.现在,除了下载部分,我都已经完成了设置.在对jQuery .post()的响应上设置标题似乎不起作用.有没有其他方法比做某种iframe技巧使这项工作(一个JavaScript/jQuery下载文件通过POST与JSON数据)?
我再次将数据发送到服务器,处理它,然后想用标题回显结果以提示下载对话框.我不想将结果写入磁盘,提供下载,然后从服务器中删除该文件.
mea*_*gar 10
不要使用AJAX.没有跨浏览器方式强制浏览器在JavaScript中显示一个存储对话框,用于通过AJAX从服务器接收的任意blob数据.如果您希望浏览器解释HTTP POST请求的结果(在这种情况下,提供下载对话框),则不要通过AJAX发出请求.
如果您需要通过AJAX执行某种验证,则必须执行两步过程,通过AJAX进行验证,然后通过将浏览器重定向到可以找到.txt文件的URL来启动下载.
在遇到类似问题的同时找到了这个帖子.这是我最终使用的解决方法:
$.post('genFile.php', {data : data}, function(url) {
$("body").append("<iframe src='download.php?url="+url+"' style='display: none;'></iframe>");
});
Run Code Online (Sandbox Code Playgroud)
genFile.php使用随机生成的filename字符串在分段位置创建文件.download.php读取生成的文件,设置MIME类型和处置(允许使用预定义的名称而不是实际文件名中的随机字符串),返回文件内容并通过删除源文件进行清理.
[编辑]不妨分享PHP代码......
的download.php:
<?php
$fname = "/tmp/".$_GET['url'];
header('Content-Type: text/xml');
header('Content-Disposition: attachment; filename="plan.xml"');
echo file_get_contents($fname);
unlink ($fname);
?>
Run Code Online (Sandbox Code Playgroud)
genFile.php:
<?php
$length = 12;
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = substr( str_shuffle( $chars ), 0, $length ).'.xml';
$fh = fopen(('tmp/'.$str), 'w') or die("can't open file");
fwrite($fh,$_POST["data"]);
fclose($fh);
echo $str;
?>
Run Code Online (Sandbox Code Playgroud)
.post()您应该通过提交表单来执行正常的POST,而不是使用jQuery ,并让服务器使用适当的Content-Encoding和MIME类型的标头进行响应.您无法触发下载,post()因为jQuery封装了返回的数据.
不过,我经常看到的一件事就是这样:
$.post('generateFile.php', function(data) {
// generateFile builds data and stores it in a
// temporary location on the server, and returns
// the URL to the requester.
// For example, http://mysite.com/getFile.php?id=12345
// Open a new window to the returned URL which
// should prompt a download, assuming the server
// is sending the correct headers:
window.open(data);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16760 次 |
| 最近记录: |