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 отвечает обычными заголовками и печатает заголовки, которые я установил для контента. Любые предложения о том, что я делаю неправильно?
Вы уверены, что file_get_contents возвращает файл? Поскольку вам нужен PHP-сервер удаленного сервера, чтобы allow_url_fopen был установлен в true, он может выйти из строя, поэтому сначала я должен проверить это. Вы также можете взглянуть на StreamedResponse, который лучше всего подходит для такого рода вещей. –
См. Руководство http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files. У них есть BinaryFileResponse, который может вас заинтересовать. – stefancarlton
К сожалению, я работаю над Symfony 2.1, который не поддерживает BinaryFileResponse. Извините, что не упоминал о версии раньше. При проверке StreamedResponse я достиг точки, где я боюсь, что что-то ужасно неправильно: я изменил код так, что я создаю пустой Response() и возвращаю его для контроллера. При вызове downloadAction с именем файла я получаю содержимое заголовка, записанное в окне браузера. –