Содержание
Возврат файла (файла любого типа) в качестве ответа от контроллера — это обычная задача, которую легко выполнить. Для обслуживания статического файла в контроллере Symfony мы рекомендуем использовать BinaryFileResponse
учебный класс. Этот класс представляет HTTP-ответ, доставляющий файл (он расширяет Response
учебный класс).
А. Возврат файла в браузере
Вы можете вернуть файл для просмотра в браузере (если поддерживается), возвращая BinaryFileResponse
Класс, так как он не имеет пользовательского расположения контента:
get('kernel')->getRootDir() . '/../web/public-resources/';
$filename = "TextFile.txt";
// This should return the file located in /mySymfonyProject/web/public-resources/TextFile.txt
// to being viewed in the Browser
return new BinaryFileResponse($publicResourcesFolderPath.$filename);
}
}
Вы также можете использовать предыдущий фрагмент если вы уверены, что возвращенный файл не будет просмотрен в браузере, а будет загружен. Тем не менее, если вам нужно загрузить файл, мы рекомендуем вам установить mimetype этого файла и установить расположение содержимого в качестве вложения, как показано в следующем примере.
Б. Возврат файла в виде загрузки
Иногда вам нужно вернуть файл для загрузки в ваш контроллер, поэтому вам нужно использовать BinaryFileResponse
класс, но вам нужно изменить расположение ответа и добавить mimetype файла, который будет загружен в заголовки. Это идеально подходит для таких файлов, как PDF-файлы, файлы документов, изображения и видео, которые вы хотите, чтобы ваши клиенты загружали, а не читали в Интернете:
get('kernel')->getRootDir() . '/../web/public-resources/';
$filename = "TextFile.txt";
// This should return the file to the browser as response
$response = new BinaryFileResponse($publicResourcesFolderPath.$filename);
// To generate a file download, you need the mimetype of the file
$mimeTypeGuesser = new FileinfoMimeTypeGuesser();
// Set the mimetype with the guesser or manually
if($mimeTypeGuesser->isSupported()){
// Guess the mimetype of the file according to the extension of the file
$response->headers->set('Content-Type', $mimeTypeGuesser->guess($publicResourcesFolderPath.$filename));
}else{
// Set the mimetype of the file manually, in this case for a text file is text/plain
$response->headers->set('Content-Type', 'text/plain');
}
// Set content disposition inline of the file
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
return $response;
}
}
Как вы можете видеть, в следующем примере мы угадали тип файла, который нужно загрузить, используя FileinfoMimeTypeGuesser
класс, если он поддерживается, в противном случае тип MIME должен быть предоставлен вами вручную.
BinaryFileResponse
будет автоматически обрабатывать Range
а также If-Range
Заголовки из запроса. Также поддерживает X-Sendfile
(см для Nginx а также апаш). Доставка статического файла, который зависит от заголовка приложения, называется функцией X-Sendfile. Чтобы использовать его, вам нужно определить, является ли X-Sendfile-Type
заголовок должен быть доверенным и вызывать trustXSendfileTypeHeader()
если он должен использовать:
BinaryFileResponse::trustXSendfileTypeHeader();
Вернуть динамически созданный файл
При отправке динамически созданного файла, вы должны добавить Content-Disposition
Заголовок вашего ответа. В обычном HTTP-ответе заголовок ответа Content-Disposition является заголовком, указывающим, предполагается ли, что содержимое будет отображаться встроенным в браузере, то есть как веб-страница или как часть веб-страницы, или в качестве вложения в этом случае, это загружается и сохраняется локально. В этом случае наш файл существует не в хранилище сервера, а в памяти и переменных.
Хотя создание этого заголовка для простых загрузок файлов очень просто, использование имен файлов, не относящихся к ASCII, является более сложным. makeDisposition()
излагает тяжелую работу за простым API:
headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
// Set the content disposition
$response->headers->set('Content-Disposition', $disposition);
// Dispatch request
return $response;
}
}
Исполнение indexAction
предыдущего контроллера, должен автоматически генерировать загрузку для текстового файла с именем TextFile
и расширение .txt
в вашем браузере. Если вы хотите просмотреть файл прямо в браузере, вы можете изменить ResponseHeaderBag::DISPOSITION_ATTACHMENT
в ResponseHeaderBag::DISPOSITION_INLINE
,
Symfony 3.2
С выпуском Symfony 3.2 в контроллерах появился новый метод, а именно файл, который принудительно загружает файл в браузере:
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
public function fileAction()
{
// load the file from the filesystem
$file = new File('/path/to/some_file.pdf');
return $this->file($file);
// rename the downloaded file
return $this->file($file, 'custom_name.pdf');
// display the file contents in the browser instead of downloading it
return $this->file('invoice_3241.pdf', 'my_invoice.pdf', ResponseHeaderBag::DISPOSITION_INLINE);
}
Повеселись !