我正在尝试在单击按钮时强制下载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();
});