首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2 setDownloadHeaders()不工作

Yii2 setDownloadHeaders()不工作
EN

Stack Overflow用户
提问于 2015-11-24 06:26:32
回答 1查看 620关注 0票数 0

代码

代码语言:javascript
复制
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();
  }
}

测试结果:

代码语言:javascript
复制
$ 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

EN

回答 1

Stack Overflow用户

发布于 2017-12-22 08:51:03

这是因为php在第一次回显时发送报头,而在Yii之前发送报头。有一些方法可以解决这个问题。

  • 将输出收集到缓冲区,然后发送。

Yii::$app->response->setDownloadHeaders("stats_$dateStamp.csv",‘文本/csv’);$data = 'id,ad_group_keyword_id,keyword,network_id,quality,event_date,clicks,cost,impressions,position,ebay_revenue,prosperent_id‘.PHP_EOL;foreach ($agkn as $row) { $data .= join(',',$row).PHP_EOL;} return $data;

  • 如果输出太大,内存无法容纳,则可能会将数据存储到临时文件。然后发送文件并删除临时文件。这种情况下不需要手动设置header。

$filePath = tempnam(sys_get_temp_dir(),'export');$fp = fopen($filePath,'w');if ($fp) {fput($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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33881903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档