symfony Excel作为乱码PK zip文件导出到浏览器

1tu0hz3e  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(125)

我正在使用一个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;
dffbzjpn

dffbzjpn1#

我知道了。我没有手动设置所有的头,而是使用了ResponseHeaderBag。现在可以用了。

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

zkure5ic2#

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()始终返回字符串中的字节数,而不是字符数)。

相关问题