2015-02-24 4 views
1

My Controller выглядит следующим образом:Как принудительно загрузить удаленный файл в Symfony2?

public function downloadAction($filename) { 
    // Adding url to filename 
    $path = $this->container->getParameter('remotepath').$filename; 

    // Checking if file exists 
    $ch = curl_init($path); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_exec($ch); 
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

    if ($code == 200) { 
     // Get the file 
     $file = file_get_contents($path); 

     // Generate Response 
     $response = new Response(); 

     $d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename); 
     $response->headers->set('Content-Disposition', $d); 

     $response->setContent($file); 
    } else { 
     $response = new Response(); 
     $response->setContent('File not found. ('.$filename.')'); 
     $response->headers->set('Content-Type', 'text/html'); 
     $response->setStatusCode(404); 
    } 
    return $response; 
} 

То, что я пытаюсь сделать, чтобы получить удаленный файл (изображение, PDF, ...) и заставить загрузку этого файла. Но по какой-то причине Symfony всегда выводит заголовок и содержимое файла в виде обычного текста (-> тарабарщины) в браузере.

Я не могу найти причину!

Редактировать: Я изменил код так, что я создаю пустой Response() и возвращаю его для контроллера. При вызове downloadAction с именем файла я получаю содержимое заголовка, записанное в окне браузера. Итак, я проверил заголовки с Firebug, и похоже, что Symfony отвечает обычными заголовками и печатает заголовки, которые я установил для контента. Любые предложения о том, что я делаю неправильно?

+0

Вы уверены, что file_get_contents возвращает файл? Поскольку вам нужен PHP-сервер удаленного сервера, чтобы allow_url_fopen был установлен в true, он может выйти из строя, поэтому сначала я должен проверить это. Вы также можете взглянуть на StreamedResponse, который лучше всего подходит для такого рода вещей. –

+0

См. Руководство http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files. У них есть BinaryFileResponse, который может вас заинтересовать. – stefancarlton

+0

К сожалению, я работаю над Symfony 2.1, который не поддерживает BinaryFileResponse. Извините, что не упоминал о версии раньше. При проверке StreamedResponse я достиг точки, где я боюсь, что что-то ужасно неправильно: я изменил код так, что я создаю пустой Response() и возвращаю его для контроллера. При вызове downloadAction с именем файла я получаю содержимое заголовка, записанное в окне браузера. –

ответ

0

Это можно сделать с помощью RedirectResponse, выполнив следующие действия в вашем методе контроллера.

return new RedirectResponse($yourRemoteDownloadUrl);

В этом примере $yourRemoteDownloadUrl является PDF-файл, который живет в ведро Amazon S3.

Работы в Symfony 2 и 3.

+0

Справедливое предупреждение, что это решение не будет «принудительно загружать» (как задано в вопросе) тип файла, который настроен для обслуживания в браузере. Например, я попробовал этот метод, чтобы принудительно загружать PNG-файлы, а не обслуживать их, но они просто отображаются в окне браузера. –

Смежные вопросы