【发布时间】:2016-09-27 06:38:26
【问题描述】:
我有一个要通过 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
(此命令正确修复存档)
这是一个错误还是我做错了什么?
我的设置:
- 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 会给出:
在 zip 文件的开头或内部增加 1 个字节
测试原始文件给出:
好的
文件大小小于 1MB。
【问题讨论】:
-
请注意,201 响应是“已创建”状态,通常您不应返回响应正文(在您的情况下为二进制响应)。看看:stackoverflow.com/questions/1226810/…
标签: symfony symfony-http-foundation