Symfony BinaryFileResponse 切断文件结尾?

Symfony BinaryFileResponse cuts off end of file?

我有一个要通过 Symfony 提供的 ZIP 文件。控制器看起来像这样:

$headers = [
    'Content-Type' => 'application/zip',
    'Content-Disposition' => 'attachment; filename="archive.zip"'
];
return new Response(file_get_contents($pathToFile), 201, $headers);

而且这个效果很好。但是,如果我尝试使用 BinaryFileResponse(如 Documentation recommends),ZIP 文件会损坏:

$response = new BinaryFileResponse($pathToFile);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
$response->setStatusCode(Response::HTTP_CREATED);
return $response;

尝试使用 zip -FF archive.zip --out fixed.zip 修复文件时得到的输出:

zip warning: End record (EOCDR) only 17 bytes - assume truncated

(此命令正确修复存档)

是bug还是我做错了什么?

我的设置:


编辑:

我已经进行了建议的更改,但问题仍然存在:

$response = new BinaryFileResponse($pathToFile);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'archive.zip');
$response->headers->set('Content-Type', 'application/zip');
clearstatcache(false, $pathToFile);
return $response;

编辑 2:

我发现了一件更有趣的事情:使用标准响应(工作代码)提供此 ZIP 文件会创建可打开的文件,但是 运行 zip -T 给出:

1 extra byte at beginning or within zipfile

测试原始文件给出:

OK

文件大小小于 1MB。

因为我看到你返回 201 http header 我假设文件是​​用相同的请求创建的。根据 symfony 文档:

If you just created the file during this same request, the file may be sent without any content. This may be due to cached file stats that return zero for the size of the file. To fix this issue, call clearstatcache(false, $file) with the path to the binary file.

解决方案:

当我在文本编辑器中打开生成的 ZIP 文件时,我发现它的开头多了一个空行...

所以我在返回 Response 对象之前添加了 ob_clean();,现在可以了!

虽然不知道这个换行符是从哪里来的...