我正在使用一个PHP函数下载一个Excel文件,这在我的本地环境和测试服务器上运行良好,但是在生产服务器上,它在浏览器窗口中打印了很多乱码。2看起来像是zip文件的“PK”代码。3结果是不一致的。4我减少了列数,它起作用了。然后我又添加了一列,它就坏了。第二天,它就正常工作了。然后我又添加了一列,它就坏了。同样的功能在应用程序的其他区域也正常工作,只是当我试图导出这个文件时。
这是一个在PHP 8.1上运行的Symfony 4.4应用程序。所有环境都应该相同。
$filePath = $path . $fileName;
$response = new Response();
$response->headers->set('Content-Type', "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
$response->headers->set('Content-Disposition', "attachment;filename={$fileName}");
$response->headers->set('Cache-Control', "no-cache");
$response->headers->set('Expires', "0");
$response->headers->set('Content-Transfer-Encoding', "binary");
$response->headers->set('Content-Length', filesize($filePath));
$request = Request::createFromGlobals();
$response->prepare($request);
$response->setContent(readfile($filePath));
$response->sendContent();
unlink($filePath);
return $response;
2条答案
按热度按时间dffbzjpn1#
我知道了。我没有手动设置所有的头,而是使用了ResponseHeaderBag。现在可以用了。
zkure5ic2#
readfile()
不会立即返回文件的内容,而是直接输出文件,因此:绝对是错的。
请改用
file_get_contents
:我将重构代码以读取文件内容,并根据
$fileContents
的字节数设置Content-Length
:(strlen()始终返回字符串中的字节数,而不是字符数)。