通过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请求):

  1. 初始发帖要求:

     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'); } });