我想将一个值保存到一个 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,没有url,因为数据要发送到当前页面。
function exportColors() {
var exportData = this.dataset.id;
$.ajax({
type: "POST",
data: {data: exportData},
success: function (data) {
console.log(data);
}
});
}
最佳答案
您需要分离功能,即先将数据发布到 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;
评论: 返回一个唯一的文件路径或通过数据库的句柄(更安全,但也更复杂)。另外,为什么用户要下载他之前提交的没有变化的数据呢?除了表面上看,还有更多内容吗?
关于javascript - 使用 ajax 和 php 下载文件 - readfile 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284428/