PHP « Symfony2 Rest API — как отдавать клиенту файл
Приветствую.
Господа, такой вопрос.
Как отдавать файл на загрузку посредством Rest API?
Как вообще это правильно делать и как кто-то из вас делал?
Ситуация такая. Клиентом API на данный момент выступает серверное web-приложение (на Symfony2), которое просто дергает api курлом. Собственно у этого приложения есть свой фротненд, и этому приложению нужно давать возможность пользователю скачать файл.
Я сейчас сделал так:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
Т.е., файл отдается в теле ответа.
Но почему-то мне кажется что это еще тот костыль.
Собственно поэтому и хочу узнать - как это нужно делать?
P.S. Считаем что клиент клиент у нас один, он написан на Symfony2 и каким-то образом он должен иметь возможность получить этот файл только описанными средствами (PHP, Symfony2), исключая другое ПО.
P.S2. Ресурс загрузки файла доступен только для авторизированных пользователей.
Господа, такой вопрос.
Как отдавать файл на загрузку посредством Rest API?
Как вообще это правильно делать и как кто-то из вас делал?
Ситуация такая. Клиентом API на данный момент выступает серверное web-приложение (на Symfony2), которое просто дергает api курлом. Собственно у этого приложения есть свой фротненд, и этому приложению нужно давать возможность пользователю скачать файл.
Я сейчас сделал так:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
$response = new BinaryFileResponse($file);
// $response->setContentDisposition(
// ResponseHeaderBag::DISPOSITION_ATTACHMENT,
// $model->item['original_name'],
// $model->item['name']
// );
// $response->prepare($this->getRequest());
// $response->sendHeaders();
$response->sendContent();
// $response->setContentDisposition(
// ResponseHeaderBag::DISPOSITION_ATTACHMENT,
// $model->item['original_name'],
// $model->item['name']
// );
// $response->prepare($this->getRequest());
// $response->sendHeaders();
$response->sendContent();
Т.е., файл отдается в теле ответа.
Но почему-то мне кажется что это еще тот костыль.
Собственно поэтому и хочу узнать - как это нужно делать?
P.S. Считаем что клиент клиент у нас один, он написан на Symfony2 и каким-то образом он должен иметь возможность получить этот файл только описанными средствами (PHP, Symfony2), исключая другое ПО.
P.S2. Ресурс загрузки файла доступен только для авторизированных пользователей.
1 ответов
Как сделал
$response = new BinaryFileResponse($file);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$model->item['original_name'],
$model->item['name']
);
$response->prepare($this->getRequest());
Содержимое файла в теле ответа. Клиент получает файл при помощи Guzzle (StreamedResponse вроде).
Естественно для больших файлов это плохое решение.
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$model->item['original_name'],
$model->item['name']
);
$response->prepare($this->getRequest());
Содержимое файла в теле ответа. Клиент получает файл при помощи Guzzle (StreamedResponse вроде).
Естественно для больших файлов это плохое решение.
А зачем ему файл отдавать? Отдавайте ему ссылку, а по ссылке - nginx'ом. Имея ссылку клиент себе разберется что с ней делать. А так - попросту лишний трафик гонять.