Как отправить файл в ответ от контроллера в Symfony 3

Возврат файла (файла любого типа) в качестве ответа от контроллера — это обычная задача, которую легко выполнить. Для обслуживания статического файла в контроллере 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);
}

Повеселись !

Ссылка на основную публикацию
Adblock
detector