利用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 文件解决文件名乱码,文件内容乱码的更多相关文章
- HTTP 下载文件中文文件名在 Firefox 下乱码问题
转自:http://www.imhdr.com/991/ HTTP 下载文件,中文文件名在 Firefox 下乱码问题 最近帮助一同事解决 HTTP 下载文件时,中文文件名在 Firefox 下乱码的 ...
- Struct2 csv文件上传读取中文内容乱码
网络上搜索下,发现都不适合 最终改写代码: FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br= n ...
- 使用JavaScript下载csv文件
前端可以使用JavaScript在客户端下载包含页面数据的文件,这里以下载CSV格式文件为例,代码如下: function downloadData(data, filename, type) { v ...
- HTML save data to CSV or excel
/********************************************************************************* * HTML save data ...
- Linux系统下利用wget命令把整站下载做镜像网站
Linux系统下利用wget命令把整站下载做镜像网站 2011-05-28 18:13:01 | 1次阅读 | 评论:0 条 | itokit 在linux下完整的用wget命令整站采集网站做镜像 ...
- Mac上利用Aria2加速百度网盘下载
百度网盘下载东西的速度那叫一个慢,特别是大文件,看着所需时间几个小时以上,让人很不舒服,本文记录自己在mac上利用工具Aria2加速的教程,windows下思路也是一样! 科普(可以不看) 这里顺带科 ...
- Use JavaScript to Export Your Data as CSV
原文: http://halistechnology.com/2015/05/28/use-javascript-to-export-your-data-as-csv/ --------------- ...
- [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 ...
- js实现使用文件流下载csv文件
1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...
随机推荐
- no branch 问题
现象如下: lynn.feng:~/project/Git/M_MT6737_MP$ git branch -a* (no branch) a36_panasonic_l004 b36_panason ...
- out 传值
public void Out(out int a, out int b) {//out相当于return返回值 //可以返回多个值 //拿过来变量名的时候,里面默认为空值 a=1; b=2; } s ...
- zookeeper系列之二—zookeeper历史
Zookeeper是什么? Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源版本.它是为分布式应用提供一致性服务的软件,提供的功能包括:配置服 ...
- .Net面試題
初级.NET开发人员 - 任何使用.NET的人都应知道的 1. 描述线程与进程的区别? 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在.进程可以定义程序的 ...
- [51NOD1065] 最小正子段和(STL,前缀和)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 估计没人这么做吧-用一个set维护前缀和,但是set的l ...
- [HDU5727]Necklace(二分图最大匹配,枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5727 题意:有N个阴珠子和N个阳珠子,特定序号的阴阳珠子放在一起会让阳珠子暗淡.现在问排放成一个环,如 ...
- JavaScript语法(一)
JavaScript 用法 HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 & ...
- Beaglebone Black– 智能家居控制系统 LAS - 刷 WiFi 模块 ESP8266 Firmware 和 ESP8266 直接收发 GPIO 信号
用 Windows 来刷 ESP8266 固件有很多中文教程,来试试直接用 BBB 刷吧.目标是 NodeMCU,ESP-01 可用,就是我买的那个. 接线方式在上一篇.当 echo ‘BB-UART ...
- 可以考虑使用SublimeText编辑器替代notepad++了
大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手,插件配置都不太成熟,如Package Control. 最喜欢用它的zencoding还得专门开个小窗:ang ...
- Expression Blend制作自定义按钮(转)
来源:http://www.cnblogs.com/iChina/archive/2011/11/25/2262854.html Expression Blend制作自定义按钮 1.从Blend工具箱 ...