由於MS Excel不能夠recognize CSV files as of utf-8 encoding我試圖手動創建這樣一個文件,並在此前添加了BOM前綴。但在我的情況下,我需要發送給用戶/瀏覽器打開,而不是將其保存在磁盤上。 012-訣竅是,對於少量的數據〜1-10它效果很好,但是當出現更多的記錄時,它無法在瀏覽器(Google Chrome,FF)中輸出,而是將結果打印爲HTML。你可能會嘗試與它在GET請求不同count
參數玩:http://tarex.ru/index.php?r=user/pricelist&file=1&count=100將hude csv文件直接發送到瀏覽器輸出不起作用
代碼
$limit = $_GET['count'] ? $_GET['count'] : 10;
$filename= 'test.csv';
$out = fopen('php://output', 'w'); // open to out in browser
fwrite($out, "\xEF\xBB\xBF"); // prepend BOM
$counter=0;
foreach(Assortment::model()->findAll( 'measure_unit<>"" AND price>0') as $d)
{
$arr = array($d->article2, $d->title, $d->oem, $d->make, $d->availability , $d->getPrice(Yii::app()->user->id), $d->getDiscountOpt(Yii::app()->user->id));
fputcsv($out, $arr, ';'); //delimiter - ;
if ($counter++ > $limit) break;
}
header('Content-type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
fclose($out);
有沒有什麼解決辦法嗎?
更新
最終我和Yii::app()->request->sendFile
turutosiya的建議後做了。
$filename='test.csv';
$filepath = Yii::app()->basePath . '/../files/'. $filename;
$out = fopen($filepath, 'w');
// writing csv ...
fwrite($out, "\xEF\xBB\xBF"); // put BOM at the beginning of file
fputcsv($out, $arr, ';');
foreach(Assortment::model()->findAll() as $d)
{
$arr = array($d->article2, $d->title, $d->oem, $d->make, $d->availability);
fputcsv($out, $arr, ';'); // separator - ;
}
fclose($out);
Yii::app()->request->sendFile($filename, @file_get_contents($filepath));
頭()不用於設置在$出resourcehandler報頭信息的方法......我覺得在工作時是隻在Chrome,FF是()方法,輸出總是在屏幕上(html) – RichardBernards 2014-11-14 15:24:30
guestimating當我去除它。它不會改變您發送的數據的任何內容,也不會改變它在客戶端上的保存/查看方式。通過刪除內容類型頭,你只是讓服務器使用其默認的MIME類型,這將是文本/ HTML。 – 2014-11-14 15:27:21
header()業務應用**只有**到http部分的文件類型 – 2014-11-14 15:29:51