我想将值保存到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);
}
});
}
答案 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)
答案 4 :(得分:0)
以下Ajax在运行时在服务器上生成一个新文件,然后单击将其下载到客户机的/ downloads目录。它使用Javascript下载文件,而不是PHP readfile()。
"default"