我有一个要通过 Symfony 提供的 ZIP 文件。控制器如下所示:
$headers = [
'Content-Type' => 'application/zip',
'Content-Disposition' => 'attachment; filename="archive.zip"'
];
return new Response(file_get_contents($pathToFile), 201, $headers);
这个效果很好。但是,如果我尝试使用 BinaryFileResponse(如文档建议的那样),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
(此命令正确修复存档)
这是一个错误还是我做错了什么?
我的设置:
- Symfony 2.8.11
- PHP 7.0.8
- Ubuntu 16.04
- nginx 1.10.0
编辑:
我已经提出了更改,但问题仍然存在:
$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
在它上面运行会给出:
开头或 zipfile 中的 1 个额外字节
测试原始文件给出:
好的
文件大小小于 1MB。