在Symfony2中提供上传文件的下载
我的Symfony2应用程序允许用户上传文件。我希望用户也能够下载他们的文件 如果我使用的是纯PHP,我只需要输出适当的头文件,然后输出文件的内容。在Symfony2控制器中如何执行此操作 (如果您在回答中使用硬编码文件名,这对我来说已经足够了。)我最后做了以下工作:在Symfony2中提供上传文件的下载,symfony,Symfony,我的Symfony2应用程序允许用户上传文件。我希望用户也能够下载他们的文件 如果我使用的是纯PHP,我只需要输出适当的头文件,然后输出文件的内容。在Symfony2控制器中如何执行此操作 (如果您在回答中使用硬编码文件名,这对我来说已经足够了。)我最后做了以下工作: /** * Serves an uploaded file. * * @Route("/{id}/file", name="event_file") * @Template() */ public function f
/**
* Serves an uploaded file.
*
* @Route("/{id}/file", name="event_file")
* @Template()
*/
public function fileAction($id)
{
$em = $this->getDoctrine()->getEntityManager();
$entity = $em->getRepository('VNNPressboxBundle:Event')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Event entity.');
}
$headers = array(
'Content-Type' => $entity->getDocument()->getMimeType(),
'Content-Disposition' => 'attachment; filename="'.$entity->getDocument()->getName().'"'
);
$filename = $entity->getDocument()->getUploadRootDir().'/'.$entity->getDocument()->getName();
return new Response(file_get_contents($filename), 200, $headers);
}
您为什么不想完全绕过Symfony,只通过HTTP服务器(Apache、Nginx等)提供文件 只需将上传的文件放在文档根目录的某个地方,让您的HTTP服务器做它最擅长的事情 更新:虽然@发布的Symfony2代码适用于99%的情况,但我只是想确保记录替代方案。另一种确保下载安全的方法是使用Lighttpd模块。对于较大的文件或需要以尽可能少的内存使用快速提供的文件,这将是理想的解决方案。请查看 它将允许您执行以下操作:
/**
* @param integer $assetId
*
* @return Response
*/
public function downloadAssetAction($assetId)
{
if (!$courseAsset = $this->get('crmpicco.repository.course_asset')->findOneById($assetId)) {
throw new NotFoundHttpException('Requested asset (' . $assetId . ') does not exist.');
}
$downloadHandler = $this->get('vich_uploader.download_handler');
return $downloadHandler->downloadObject($courseAsset->getFile(), 'assetFile', null, $courseAsset->getName());
}
请注意:如果您使用的是Symfony master,那么您应该使用@1ed-但这仅适用于2.1分支,而不是2.0分支。2.1分支尚未稳定。@Jason-您也可以,但它仅在2.1分支中可用。非常感谢!我尝试了其他的一切,但它总是说,该文件无法找到。。。但是你的正在工作+1@JasonSwett如果文件很大,会不会导致内存不足?这是个好主意,除非我只希望某些用户能够访问某些文件。@JasonSwett:没问题,我还用另一个选项对我的答案进行了更新。将文件加载到内存(
file\u get\u contents()
)只是为了将其发送到用户的浏览器可能适用于许多情况,但并非所有情况。使用nginx,您可以使用X-Accel-Redirect头$response->headers->set('X-Accel-Redirect',$path)
并创建一个内部nginx规则。