之前写的一个wordpress插件里有一个功能,就是可以直接返回文件的数据,实现浏览器下载功能。但是昨天突然发现下载的文件有点小问题(文件时epub格式的,使用苹果系统自带的阅读软件打开的时候,提示导入出错),心想不应该呀,之前一直好好的用着呢。怎么会突然出现这个问题的!代码也没有改过!
发现问题,解决问题。首先对比一下,使用php方式下载来的文件和原文件有什么差别:
使用vscode对比了一下,发现是因为文件的第一行多了一个空白行!
赶快检查了一下代码,代码中并没有在readfile()函数执行之前,输出任何字符。通过浏览器检查了一下wordpress网站的前端代码,发现所有的页面第一行都有一个空行。
排查一下是什么原因,于是就关闭了所有的插件,切换回官方默认的主题。结果也还是一样,首行还是空白。由于是线上项目就没有过多测试,可能是前几天wordpress自动更新的问题。赶快解决这个问题,让网站用户可以正常下载。
解决方案很简单,只需要在readfile()函数之前加上以下代码就可以
function download_file() {
// 设置文件路径
$file_path = 'path/to/your/file.epub';
// 清除输出缓冲区
ob_get_clean(); //这是新增的代码
ob_clean(); //这是新增的代码
// 设置文件下载头信息
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file_path));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
// 读取并返回文件内容
readfile($file_path);
exit;
}
一般情况下只使用 ob_clean();
这个函数就可以了,但是实际此时需要同时使用 ob_get_clean();
和 ob_clean();
才可以!
具体wordpress网站返回的前端代码的第一行是空行的原因还没找到,先给大家写一个解决办法,让我明天好好查找一下再补充此文章!