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

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);
	}
}

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

时间: 2024-08-25 14:08:27

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

Struct2 csv文件上传读取中文内容乱码

网络上搜索下,发现都不适合 最终改写代码: FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br= null; try { fis = new FileInputStream(file); isr = new InputStreamReader(fis,"gbk"); br = new BufferedReader(isr); String line1 = null; while ((li

使用JavaScript下载csv文件

前端可以使用JavaScript在客户端下载包含页面数据的文件,这里以下载CSV格式文件为例,代码如下: function downloadData(data, filename, type) { var file = new Blob(["\ufeff" + data], { type: type }); if (window.navigator.msSaveOrOpenBlob) // IE10+ window.navigator.msSaveOrOpenBlob(file, fi

下载CSV文件到本机(SAP_CONVERT_TO_TEX_FORMAT)

CSV文件是逗号分隔符格式的文件.将内表数据下载成CSV文件到本机上要先将内表中的数据通过函数SAP_CONVERT_TO_TEX_FORMAT转换成CSV格式,然后再下载到本机. REPORT z_download_csv. TYPE-POOLS: truxs. *&---------------------------------------------------------------------* *& Data Types *&---------------------

Linux系统下利用wget命令把整站下载做镜像网站

Linux系统下利用wget命令把整站下载做镜像网站 2011-05-28 18:13:01 | 1次阅读 | 评论:0 条 | itokit  在linux下完整的用wget命令整站采集网站做镜像 的命令是及无视网站根目录下的robots.txt限制.并且可以模拟一个正常浏览者的信息下载该网站. C/C++ Code复制内容到剪贴板 wget -m -e robots=off -U "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.

利用SSH软件上传、下载(使用sz与rz命令)

1.简述 通常,利用SSH管理远程Linux服务器时,经常需要与本地交互文件.当然,我们可以利用FTP方式,比如通过Filezilla客户端软件.不过直接使用SSH软件(SecureCRT.Xshell)自带的上传和下载功能无疑使最方便快捷的.通常SSH软件支持的文件传输协议主要有ASCII.Xmodem.Zmodem等. rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 首先,你的Linux端(CentOS, Ubuntu)需要安装rz.sz. 其次,

[Python] Read and plot data from csv file

Install: pip install pandas pip install matplotlib # check out the doc from site import pandas as pd import matplotlib.pyplot as plt from numpy import mean def load_df(symbol): return pd.read_csv("data/{0}.csv".format(symbol)) def get_max_close(

利用Travis CI+GitHub实现持续集成和自动部署

前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标配". 什么是持续集成 Continuous Integration(CI) is a development practice that requires developers to integrate code into a shared repository several times a d

108.生成和下载csv文件

生成CSV文件 有时候我们做的网站,需要将一些数据,生成一个csv文件返回浏览器,并且是作为附件的形式下载下来. 生成小的csv文件: 生成一个小的csv文件,我们用Python内置的csv模块来处理csv文件,并且使用HttpResponse来将csv文件返回回去.==采用python内置的csv模块创建csv文件示例代码如下:== from .models import User import csv from django.template import loader, Context d

NodeJS CSV导出文件名和内容乱码解决

// 解决不同浏览器下载文件名称乱码 var userAgent = (req.headers['user-agent']||'').toLowerCase(); res.set('Content-Type', 'application/octet-stream;charset=utf-8'); if(userAgent.indexOf('msie') >= 0 || userAgent.indexOf('chrome') >= 0) { res.setHeader('Content-Disp