我正在尝试创建&使用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;
答案 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.'"',
]
);