У меня проблема с возвратом веб-сервиса, заголовок выглядит так:

header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'.$this->filename.".csv".'"');

Я собираю данные и просто возвращаю их вот так:

    foreach($this->output_data as $each_table) {
        foreach($each_table as $each_row) {
            foreach($each_row as $each_key => $each_value){ 
                $string .= Sanitize::escape($each_value).$this->delimiter;
            }                              
            $string .= "\n";
        }            
    }
    print($string); 

Я ожидаю возвращения csv-файла в виде потока. Но возвращаемся " HTML-документ Firefox ". Я этого не понимаю.

Я уже отключил рендеринг вида в контроллере. Что я могу сделать?

0
user2140111 20 Мар 2013 в 13:09
Какая версия cakephp? В 2.x вы не используете header () напрямую, вместо этого вы используете класс reponse.
 – 
mark
20 Мар 2013 в 13:21
Также не забудьте отключить autoRender ($ this-> autoRender = false); если вы не используете файл просмотра для вывода результатов. Если вы используете CakePHP 2.x; дополнительную информацию о классе ответа (как предлагает @mark) можно найти здесь; Работа с типами контента
 – 
thaJeztah
20 Мар 2013 в 14:08
Его 2.4. Вы мне правильно намекнули. Я изменил код
 – 
user2140111
20 Мар 2013 в 14:36
$ this-> response-> header (array ('Content-Disposition: attachment; filename = "'. Configure :: read ('reporting_config') ['file_name']. '"')); $ this-> response-> type ('приложение / текст-csv'); print ($ this-> send_method-> get_output_data ());
 – 
user2140111
20 Мар 2013 в 14:36
Возможно, cakePHP перенаправит вас на страницу с ошибкой (в View / Errors: error500.ctp или error400.ctp). Вы пробовали посетить страницу в веб-браузере и убедиться, что вывод отображается правильно?
 – 
Yoggi
20 Мар 2013 в 15:33

1 ответ

Лучший ответ

Неправильно просто выводить некоторые форматированные строки из контроллера или модели. Я обнаружил, что нужно использовать Response-Class. Код ниже:

$this->response->header(array( 'Content-Disposition: attachment; filename="<filename.ext>"));
$this->response->type('application/text-csv');                     
$this->response->body(<returnData>);

Обязательно используйте правильный «тип».

0
user2140111 26 Мар 2014 в 16:49