• 技术文章 >后端开发 >php教程

    利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码

    2016-06-23 13:52:40原创637

    利用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 浏览器文件名也是乱码。于是对辅助函数做了以下的修改,以下加了背景颜色的代码是我添加的。

    if ( ! function_exists('force_download')){	function force_download($filename = '', $data = '')	{		if ($filename == '' OR $data == '')		{			return FALSE;		}		//ie 浏览器解决文件名是乱码		$filename = urlencode($filename);               $filename = str_replace("+", "%20", $filename);		// Try to determine if the filename includes a file extension.		// We need it in order to set the MIME type		if (FALSE === strpos($filename, '.'))		{			return FALSE;		}			// Grab the file extension		$x = explode('.', $filename);		$extension = end($x);		// Load the mime types		@include(APPPATH.'config/mimes'.EXT);			// Set a default mime if we can't find it		if ( ! isset($mimes[$extension]))		{			$mime = 'application/octet-stream';		}		else		{			$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];		}			// Generate the server headers		if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))		{			header('Content-Type: "'.$mime.'"');			header('Content-Disposition: attachment; filename="'.$filename.'"');			header('Expires: 0');			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');			header("Content-Transfer-Encoding: binary");			header('Pragma: public');			header("Content-Length: ".strlen($data));		}elseif(strstr($_SERVER['HTTP_USER_AGENT'], "Firefox")){   //解决firefox 文件名乱码			header('Content-Type: "'.$mime.'"');			header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');			header('Expires: 0');			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');			header("Content-Transfer-Encoding: binary");			header('Pragma: public');			header("Content-Length: ".strlen($data));		}else		{			header('Content-Type: "'.$mime.'"');			header('Content-Disposition: attachment; filename="'.$filename.'"');			header("Content-Transfer-Encoding: binary");			header('Expires: 0');			header('Pragma: no-cache');			header("Content-Length: ".strlen($data));		}			exit($data);	}}



    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:data 内容 利用 文件 乱码
    上一篇:php 回调函数(callback) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文详解PHP用流方式实现下载文件(附代码示例)• PHP反序列化入门总结(小白必看)• PHP原生类的总结分享• 聊聊PHP escapeshellarg函数使用的中文问题• 分享PHP函数使用小工具(附代码示例)
    1/1

    PHP中文网