用ajax和php下载文件 - readfile不能正常工作

时间:2015-12-15 08:39:58

标签: javascript php jquery ajax

我想将值保存到txt文件并将其下载给用户。

现在,正确地将值打印到txt文件中,但不会触发readfile函数,因此不会开始下载。

php,此代码与ajax调用位于同一页面上。

<?php 
if (isset($_POST['data']))
{
$handle = fopen("file.txt", "w");
fwrite($handle, $_POST['data']);
fclose($handle);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');    
exit;   

}

?>

javascript,没有网址,因为数据将被发送到当前页面。

 function exportColors() {        
    var exportData = this.dataset.id;

    $.ajax({
            type: "POST",
            data: {data: exportData},
            success: function (data) {
               console.log(data);   
            }   
        });


}

5 个答案:

答案 0 :(得分:1)

您需要分离功能,即首先将数据发布到PHP,保存文本文件的内容,然后在第二个请求中让用户下载文件。所以一种(骨架)方法是:

JS文件:

function exportColors() {        
    var exportData = this.dataset.id;

    $.ajax({
        type: "POST",
        data: {data: exportData},
        success: function (data) {
            // redirect or print out a link
        }   
    });

}

第一次请求的PHP文件(保存内容):

<?php 
if (isset($_POST['data'])) {
    $handle = fopen("file.txt", "w");
    fwrite($handle, $_POST['data']);
    fclose($handle);
    // give back some unique id or the unique filepath
}
?>

第二次请求的PHP文件(通过点击链接或重定向后):

// essentially everything that outputs your file
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');    
exit;   

<强> 评论: 要么返回一个唯一的文件路径,要么通过数据库中的句柄(更安全,但也更复杂)。此外,为什么用户应该下载他之前提交的未更改数据?还有更多的东西比满足眼睛吗?

答案 1 :(得分:0)

好的我出去了,所以带上一粒盐。

你说这个请求会转到当前页面吗?这是否意味着您已经从您向我们展示的PHP文件中排除(为了简洁起见)HTML内容?如果您的任何内容高于开始<?php标记,那么对header的任何调用都将失败并显示错误(因为标题必须位于请求正文之前)。这将导致脚本终止并阻止访问readfile行。

您的标头是否已发送?你在错误日志中看到了什么吗?如果这些答案分别为是和否,那我就错了,你可以忽略它。

答案 2 :(得分:0)

由于安全原因,由于java脚本限制,ajax将无法将文件下载/保存到客户端系统。

相反,您可以使用

jquery.fileDownload.js

请查看http://jqueryfiledownload.apphb.com/

希望这有帮助。

答案 3 :(得分:0)

你不能

beacuse javascript无法在用户文件系统上写入。

见答案

Download a file by jQuery.Ajax

很好地解释问题

答案 4 :(得分:0)

以下Ajax在运行时在服务器上生成一个新文件,然后单击将其下载到客户机的/ downloads目录。它使用Javascript下载文件,而不是PHP readfile()。

"default"