2015-11-23 6 views
0

КодYii2 setDownloadHeaders() не работает

public function actionExport() { 
    ini_set('memory_limit','32M'); 
    $whileAgo = date('Y-m-d', time() - 2*24*60*60); // 7-9 seems to be the limit for # days before the 30s timeout 
    $agkn = AdGroupKeywordNetwork::find() 
    ->select(['field1', 'field2', ...]) 
    ->where(['>', 'event_date', $whileAgo])->asArray()->each(10000); 
    $dateStamp = date('Y-m-d'); 
    Yii::$app->response->setDownloadHeaders("stats_$dateStamp.csv", 'text/csv'); 
    echo 'id,ad_group_keyword_id,keyword,network_id,quality,event_date,clicks,cost,impressions,position,ebay_revenue,prosperent_revenue'.PHP_EOL; 
    // flush(); // gives us 55s more // doesn't work with gzip 
    foreach ($agkn as $row) { 
    echo join(',', $row).PHP_EOL; 
    // flush(); 
    } 
} 

Испытано:

$ time (curl -sv -b 'PHPSESSID=ckg8l603vpls8jgj6h49d32tq0' http://localhost:81/web/ad-group-keyword-network/export | head) 
... 
< HTTP/1.1 200 OK 
< Transfer-Encoding: chunked 
< Content-Type: text/html; charset=UTF-8 
< 
{ [8277 bytes data] 
id,ad_group_keyword_id,keyword,network_id,quality,event_date,clicks,cost,impressions,position,ebay_revenue,prosperent_revenue 
9690697,527322,ray ban predator,1,6,2015-11-22,0,0.00,1,5.0,, 

Это не скачивая файл CSV в браузере либо. Это не настройка заголовков. Что не так?

Ссылка: http://www.yiiframework.com/doc-2.0/yii-web-response.html#setDownloadHeaders()-detail

+0

Ok я получил его для вывода 'заголовка Content-Disposition', поставив' Yii :: $ app-> response-> отправить() 'сразу после' setDownloadHeaders() ', но Заголовок Content-Type по-прежнему ошибочен. – Chloe

+0

Есть несколько экспортных расширений csv. Делает вещи намного легче, чтобы не изобретать колесо. –

ответ

0

Это потому, что PHP отправить заголовок на первое эхо, прежде, чем Yii это делает. Есть какой-то способ решить проблему.

  • Соберите выход в буфер, а затем отправьте его.

    Yii::$app->response->setDownloadHeaders("stats_$dateStamp.csv", 'text/csv'); 
        $data = 'id,ad_group_keyword_id,keyword,network_id,quality,event_date,clicks,cost,impressions,position,ebay_revenue,prosperent_revenue'.PHP_EOL; 
        foreach ($agkn as $row) { 
         $data .= join(',', $row).PHP_EOL; 
        } 
    
        return $data; 
    
  • Если выход слишком велик, чтобы поместиться в памяти, то данные могут быть сохранены временный файл. Затем отправьте файл и удалите временный файл. В этом случае нет необходимости устанавливать заголовок вручную.

    $filePath = tempnam(sys_get_temp_dir(), 'export'); 
        $fp = fopen($filePath, 'w'); 
        if ($fp) { 
         fputs($fp, ...); 
        } 
        fclose($fp); 
    
        return Yii::$app->response->sendFile($filePath, "stats_$dateStamp.csv") 
         ->on(\yii\web\Response::EVENT_AFTER_SEND, function($event) { 
          unlink($event->data); 
         }, $filePath); 
    
Смежные вопросы