2

我有一个要通过 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。

4

2 回答 2

4

解决方案:

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

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

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

于 2016-09-27T13:29:57.847 回答
0

由于我看到您返回 201 http 标头,因此我假设文件已使用相同的请求创建。根据 symfony 文档:

如果您刚刚在同一请求期间创建了文件,则发送的文件可能没有任何内容。这可能是由于缓存的文件统计信息返回的文件大小为零。要解决此问题,请使用二进制文件的路径调用 clearstatcache(false, $file)。

于 2016-09-27T08:54:12.363 回答