ホームページ >バックエンド開発 >PHPチュートリアル >php CI Force_download($filename, $data) を使用して .csv ファイルをダウンロードし、ファイル名とファイルの内容が文字化けする問題を解決します。
php CI Force_download($filename, $data) を使用して .csv ファイルをダウンロードし、ファイル名とファイルの内容が文字化けする問題を解決します。長い間これを行った後、ついに良い解決策を見つけました。
1. 補助関数のロード
$this->load->helper('download'); //下载辅助函数$this->load->helper('string'); //字符编码转换辅助翻书
2. Force_download($filename, $data) $data が文字列でなければならないことがわかります。文字列でない場合は、エラーが発生します。これは配列なので、implode関数を使用する必要があります。この関数の使用方法については、私のプロジェクトのコードは次のとおりです。
public function download() { // 输出Excel文件头 //解决IE,firework等浏览器文件名乱码问题 $filename = '已拆回款数据.csv'; $newarray=array();该结果是一个二维数组 if ($this->input->get () !== false) { $conn = $this->getformdata (); } // 输出Excel列名信息 $head = array ( 'ID', '回款号', '回款金额(分)', '调整渠道成本', '回款时间', '导入SO时间', '渠道名称', '合同ID' ); foreach ( $head as $i => $v ) { // CSV的Excel支持GBK编码,一定要转换,否则乱码 $head [$i] = utf2gbk($v); } $newarray[]=implode(',',$head); $sql = "select * from sinapay_boss_income where {$conn} order by income_status asc, boss_income_id desc"; $query = $this->db->query ( $sql ); // 计数器 $cnt = 0; // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小 $limit = 8000; foreach ( $query->result_array () as $row ) { $cnt ++; if ($limit == $cnt) { // 刷新一下输出buffer,防止由于数据过多造成问题 ob_flush (); flush (); $cnt = 0; } // 读取表数据 $content = array (); $content [] =$row ['boss_income_id']; $content [] =$row ['income_num']; $content [] =$row ['income_amount']; $content [] =$row ['modified_cost']; $content [] =$row ['income_date']; $content [] =$row ['write_so_month']; $content [] =utf2gbk($row ['channel_name']); $content [] =utf2gbk($row ['income_contract_id']); $newarray[]=implode(',',$content); } $newarray=implode("\n",$newarray); force_download($filename, $newarray); }}
3. 試してみたところ、IE ブラウザのファイル名が文字化けしており、Firefox ブラウザのファイル名も文字化けしていました。そこで、補助関数に次のような変更を加えました。以下の背景色を追加するコードは私が追加しました。
れーい