【问题标题】:Symfony BinaryFileResponse cuts off end of file?Symfony BinaryFileResponse 切断文件结尾?
【发布时间】: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。

【问题讨论】:

标签: symfony symfony-http-foundation


【解决方案1】:

解决方案:

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

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

不知道这个换行符是从哪里来的……

【讨论】:

  • 这里相同:该修复对我有用!谢谢你。奇怪的错误:PHP 或 Symfony 在文件开头添加了一个空行(在我的例子中是 JPG 而不是 ZIP)。无论我用什么方法来生成文件(最终使用 BinaryFileResponse)都是如此。假设 Symfony 中的某个地方存在错误?这在 Symfony 2.8.15、Ubuntu 16.04、Apache2、PHP 5.6 上。在 Symfony 2.3 中不是问题。喜欢以错误的形式提交,但不确定我能否足够准确地追踪它。
  • 如果您遇到这种情况,请在您的文件中寻找空的换行符或<?php 之前的任何额外空格 - PHP 会在实际内容之前回显它。
【解决方案2】:

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

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

【讨论】:

  • 我试过没有效果。事实上,文件不会在没有 any 内容的情况下发送,但只是文件末尾被截断了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2013-04-13
  • 2014-11-30
相关资源
最近更新 更多