Загрузите загруженный файл в Symfony2 - PullRequest
8 голосов
/ 02 апреля 2012

Приложение My Symfony2 позволяет пользователям загружать файлы. Я хотел бы, чтобы пользователи также могли загружать свои файлы.

Если бы я делал обычный PHP, я бы просто вывел соответствующие заголовки, а затем вывел содержимое файла. Как бы я сделал это в контроллере Symfony2?

(Если вы используете жестко закодированное имя файла в своем ответе, мне этого достаточно.)

Ответы [ 3 ]

15 голосов
/ 02 апреля 2012

Я закончил этим:

/** 
 * 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);
}   
2 голосов
/ 02 апреля 2012

Есть ли причина, по которой вы не хотите полностью обходить Symfony и просто передавать файл через HTTP-сервер (Apache, Nginx и т. Д.)?

Просто удалите загруженные файлы где-нибудь в корне документа и позвольте вашему HTTP-серверу делать то, что он делает лучше всего.

Обновление: Хотя код Symfony2, опубликованный @ Джейсоном Светтом , будет работать в 99% случаев - я просто хотел убедиться в том, что задокументированы альтернативные варианты. Другой способ обеспечить загрузку - использовать модуль Lighttpd mod_secdownload. Это было бы идеальным решением для больших файлов или файлов, которые необходимо быстро обслуживать при минимальном использовании памяти.

0 голосов
/ 18 февраля 2016

Посмотрите на VichUploaderBundle

Это позволит вам сделать это:

/**
 * @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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...