Symfony php zip文件在下载时只有零字节

时间:2016-01-21 16:40:45

标签: php symfony

我正在尝试创建&使用symfony2下载zip文件。当我创建zip文件时,一切看起来都很棒。当我在服务器上查看zip文件时,一切看起来都很棒。当我下载zip文件时,它有零字节。我的回答出了什么问题?

    // Return response to the server...
    $response = new Response();
    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/zip');
    $response->headers->set('Content-Disposition', 'attachment; filename="'.$zipName.'"');
    $response->headers->set('Content-Length', filesize($zipFile));
    return $response;

3 个答案:

答案 0 :(得分:2)

可能你错过了文件内容。

尝试

$response = new Response(file_get_contents($zipFile));

而不是

$response = new Response();

希望这个帮助

答案 1 :(得分:2)

您所做的是发送包含标题的回复。只有标题。您也需要发送文件。

查看Symfony文档:http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files

在vanilla PHP中你想要:

header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header("Content-Disposition: attachment; filename=$filename");

然后将文件读取到输出。

$handle = fopen('myfile.zip', 'r');    

while(!eof($handle)) {
echo fread($handle, 1024);
}

fclose($handle);

通过文档,您可以轻松找到解决方案;)

编辑:

请注意文件的大小。使用file_get_contents或stream_get_contents,您将整个文件加载到PHP的内存中。如果文件很大,你可以达到php的内存限制并最终导致致命错误。 使用带有fread的循环,只需将1024字节的块加载到内存中。

编辑2:

我有时间测试,这适用于大文件:

$response = new BinaryFileResponse($zipFile);
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment; filename="'.basename($zipFile).'"');
$response->headers->set('Content-Length', filesize($zipFile));

return $response;

希望这完全回答你的问题。

答案 2 :(得分:1)

靠近目标!

  // Return response to the server...
    $response = new Response();
    $response->setContent(file_get_contents($zipFile));
    $response->setStatusCode(200);
    $response->headers->set('Content-Type', 'application/zip');
    $response->headers->set('Content-Disposition', 'attachment; filename="'.$zipName.'"');
    $response->headers->set('Content-Length', filesize($zipFile));
    return $response;

或更简单

return new Response(
            file_get_contents($zipFile),
            200,
            [
                'Content-Type'        => 'what you want here',
                'Content-Disposition' => 'attachment; filename="'.$fileName.'"',
            ]
        );