通过ajax调用php下载文件
我有一个button, onclick
它会调用一个Ajax函数。
这是我的ajax函数
function csv(){ ajaxRequest = ajax();//ajax() is function that has all the XML HTTP Requests postdata = "data=" + document.getElementById("id").value; ajaxRequest.onreadystatechange = function(){ var ajaxDisplay = document.getElementById('ajaxDiv'); if(ajaxRequest.readyState == 4 && ajaxRequest.status==200){ ajaxDisplay.innerHTML = ajaxRequest.responseText; } } ajaxRequest.open("POST","csv.php",false); ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); ajaxRequest.send(postdata); }
我根据用户input创build了csv文件。 创build后,我希望它提示下载或强制下载(最好是强制)。 我在php文件的末尾使用下面的脚本来下载文件。 如果我在一个单独的文件中运行这个脚本,它工作正常。
$fileName = 'file.csv'; $downloadFileName = 'newfile.csv'; if (file_exists($fileName)) { header('Content-Description: File Transfer'); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename='.$downloadFileName); ob_clean(); flush(); readfile($fileName); exit; } echo "done";
但是如果我在csv.php的末尾运行它,它会将file.csv的内容输出到页面(进入ajaxDiv)而不是下载。
有没有办法强制下载文件在csv.php结束?
AJAX不适用于下载文件。 popup一个新的窗口,下载链接作为它的地址,或者做document.location = ...
使用jQuery一个非常简单的解决scheme:
在客户端:
$('.act_download_statement').click(function(e){ e.preventDefault(); form = $('#my_form'); form.submit(); });
并在服务器端,确保您发回正确的Content-Type
标题,以便浏览器知道它的附件,下载将开始。
我用隐藏的iframe完成了这个工作。 我使用Perl,而不是PHP,所以只会给概念,而不是代码解决scheme。
客户端向服务器发送Ajax请求,导致生成文件内容。 这将作为临时文件保存在服务器上,并将文件名返回给客户端。
客户端(JavaScript)接收文件名,并将iframe src设置为将传递文件的某个URL,如下所示:
$('iframe_dl').src="/app?download=1&filename=" + the_filename
服务器slurps文件,取消链接,并发送stream到客户端,这些标头:
Content-Type:'application/force-download' Content-Disposition:'attachment; filename=the_filename'
奇迹般有效。
@joe:非常感谢,这是一个好头!
我有一个稍微困难的问题:1.发送一个带有POST数据的AJAX请求,让服务器产生一个ZIP文件2.得到一个响应3.下载ZIP文件
所以这就是我做的(使用JQuery来处理AJAX请求):
-
初始发帖要求:
var parameters = { pid : "mypid", "files[]": ["file1.jpg","file2.jpg","file3.jpg"] }
var parameters = { pid : "mypid", "files[]": ["file1.jpg","file2.jpg","file3.jpg"] }
var options = {
url:“请求/url”,/ /replace您的请求url
键入:“POST”,/ /replace您的请求types
数据:参数,//见上面
上下文:document.body,//用你的概念replace
成功:function(数据){
如果(数据){
if(data.path){
//创build一个隐藏的iframe,并将'src'属性设置为创build的ZIP文件。
var dlif = $('<iframe/>
',{'src':data.path})。hide();
//将iFrame附加到上下文
this.append(DLIF);
} else if(data.error){
警报(data.error);
} else {
警报(“出错了”);
}
}
}
};
$阿贾克斯(选件);
“request / url”处理压缩文件的创build(closures主题,所以我不会发布完整的代码)并返回下面的JSON对象。 就像是:
//Code to create the zip file //...... //Id of the file $zipid = "myzipfile.zip" //Download Link - it can be prettier $dlink = 'http://'.$_SERVER["SERVER_NAME"].'/request/download&file='.$zipid; //JSON response to be handled on the client side $result = '{"success":1,"path":"'.$dlink.'","error":null}'; header('Content-type: application/json;'); echo $result;
如果需要,“请求/下载”可以执行一些安全检查,并生成文件传输:
$fn = $_GET['file']; if ($fn) { //Perform security checks //.....check user session/role/whatever $result = $_SERVER['DOCUMENT_ROOT'].'/path/to/file/'.$fn; if (file_exists($result)) { header('Content-Description: File Transfer'); header('Content-Type: application/force-download'); header('Content-Disposition: attachment; filename='.basename($result)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($result)); ob_clean(); flush(); readfile($result); @unlink($result); } }
你不能通过ajax直接下载文件。
您可以在页面上放置一个链接到您的文件的URL(从ajax调用返回),或者另一种方法是使用隐藏的iframe
并dynamic设置iframe
的源URL。 这样你就可以下载文件而不刷新页面。
这是代码
$.ajax({ url : "yourURL.php", type : "GET", success : function(data) { $("#iframeID").attr('src', 'downloadFileURL'); } });