场景:tp5或者php项目部署到服务器后,下载功能出现了bug。
1、文件打开出错,强行打开则出现乱码。
2、文件内容有中文时出现乱码
搜索了一下,有两个解释:
1、在下载的过程中不要 输出任何非文件信息,比如 echo,var_dump信息。 否则下载后的文件无法打开,提示格式错误或者文件被破坏。
2、 输出的文件格式一定要和后缀名保存一致,否则会提示格式错误或者文件被破坏。(或者你自己知道文件后缀,自行更改应该也可以)
后来搜索到可能是BOM头的问题,因为打开乱码的文件,前面都会有“0xEF 0xBB 0xBF”三个字符。而PHP无法识别BOM头。
BOM头的解释:在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码。它平时是一串隐藏的字符,许多软件可以识别并忽略BOM头,而PHP则不能。
因此,可以将需要上传的文件用editplus、ultraedit或者WINHEX等软件去掉BOM头之后,再上传。已经下载下来的则去掉BOM头再打开。
另外,也可以在你的readfile、fread,即输出前加上一句代码:ob_clean() 来清空缓冲区。
=以下代码放在输出文件的时候,可以解决文件内容中文出现乱码的问题=
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: ".filesize($file_path));
header("Content-Disposition: attachment; filename=".$file_name);
//输出文件内容
ob_clean();
echo fread($file_open,filesize($file_path));
fclose($file_open);
有什么不懂的可以联系我qq:532526447