在Symfony2中提供上传文件的下载

在Symfony2中提供上传文件的下载,symfony,Symfony,我的Symfony2应用程序允许用户上传文件。我希望用户也能够下载他们的文件 如果我使用的是纯PHP,我只需要输出适当的头文件,然后输出文件的内容。在Symfony2控制器中如何执行此操作 (如果您在回答中使用硬编码文件名,这对我来说已经足够了。)我最后做了以下工作: /** * Serves an uploaded file. * * @Route("/{id}/file", name="event_file") * @Template() */ public function f

我的Symfony2应用程序允许用户上传文件。我希望用户也能够下载他们的文件

如果我使用的是纯PHP,我只需要输出适当的头文件,然后输出文件的内容。在Symfony2控制器中如何执行此操作

(如果您在回答中使用硬编码文件名,这对我来说已经足够了。)

我最后做了以下工作:

/** 
 * 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规则。