Ajax/PHP 文件下载不起作用



我正在尝试在单击按钮时强制下载txt文件。内容是动态生成的,并存储在 javascript 变量中。单击按钮时不会出现下载窗口,但 ajax 调用成功。我做错了什么?

该 php:

<?php
$Proof = $_REQUEST["Proof"];
$proof = stripslashes($Proof);
$file = 'savedproof.txt';
file_put_contents($file, $proof);
header('Content-disposition: attachment; filename="'.$file.'"');
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header('Content-Description: File Transfer');
readfile($file);
?>

javascript:

$("#save").click(function () {
    var proof = $("#main").html();
     $.ajax({ 
             type: 'POST', 
             url: 'save-to-file.php',
             data: {Proof: Proof},
             dataType: "html"
            });
}

或者,我尝试使用window.location.href,但我无法将变量Proof传递给php文件。我尝试了这样的事情:

window.location.href ="download.php?Proof="+Proof;

尽管确实会出现下载对话框,但文件中只有变量 Proof 的开头部分。我在Firefox和chrome上测试了两种方式。

出于

安全考虑,Javascript 无法将文件下载到客户端计算机。

只需将按钮设置为链接(根据需要设置样式)并执行以下操作:

<a id="save" href='/path/to/download.php' target="_blank"></a>

然后有一个onready函数,根据#main的值更改href

$.ready(
   var proof = $('#main').html();
   var href = $('#save').attr('href') + '?Proof=' + encodeURIComponent(proof);
   $('#save').attr('href', $href); 
});

我所知,这里根本没有 AJAX 的理由。

您的 AJAX 请求不起作用,因为它没有触发浏览器导航。它只是向Javascript提供响应,而Javascript忽略了它。您可能需要构建一个假<form>元素并提交它以获取要下载的结果。

window.location.href而言,URL通常限制在2到4 KB左右,因此您会被切断。所以这是行不通的。

您可以通过 jquery 创建和发送表单(页面未重新加载)来执行此操作:

$(document).on('click', '#save', function () {
    var proof = $("#main").html();
    var form = $(document.createElement('form'));
    form.attr('action', 'save-to-file.php');
    form.attr('method', 'POST');
    var input = $('<input>').attr('type', 'hidden').attr('name', 'Proof').val(proof);
    form.append(input);
    form.appendTo(document.body);
    form.submit();
    form.remove();
});

最新更新