wordpress使用readfile()返回文件被添加额外字符的解决办法

之前写的一个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网站返回的前端代码的第一行是空行的原因还没找到,先给大家写一个解决办法,让我明天好好查找一下再补充此文章!

庄朋龙
庄朋龙

一个爱生活的技术菜鸟

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注