Excel以乱码PK zip文件的形式导出到浏览器



这让我抓狂。我正在使用PHP函数下载Excel文件。这在我的本地环境和测试服务器上运行良好,但在生产服务器上,它没有下载电子表格,而是将大量乱码文本打印到浏览器窗口。它看起来像";PK";zip文件的代码。结果不一致。我减少了列的数量,这很有效。然后我又加了一列,它就断了。然后第二天它就工作了。然后我再加一列,它就断了。同样的功能也适用于应用程序的其他区域,只是当我尝试导出这一个文件时。

这是一个运行在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;

我得到了它。我没有尝试手动设置所有这些标头,而是使用了ResponseHeaderBag。现在工作。

return $this->file("export/".$fileName, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);

一开始,readfile()不返回文件的内容,而是直接输出,因此:

$response->setContent(readfile($filePath));

肯定是错误的。

而是使用file_get_contents:

$response->setContent(file_get_contents($filePath));

我会重构代码以读取文件内容,并根据$fileContents的字节数设置Content-Length

$fileContents = file_get_contents($filePath);
$response->headers->set('Content-Length', strlen($fileContents));
$request = Request::createFromGlobals();
$response->prepare($request);
$response->setContent($fileContents);

(strlen((总是返回字符串中的字节数,而不是字符数(。

最新更新