2014-07-31 12:53 1047人阅读 评论(0) 收藏 举报
 分类:
mysql(8)  php 算法(20)  php(38) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码。做了很久终于知道了很好的解决方案。

1.加载辅助函数

  1. $this->load->helper('download');  //下载辅助函数
  2. $this->load->helper('string');    //字符编码转换辅助翻书

2.force_download($filename, $data)通过它的代码可以知道$data 必须是字符串,如果不是字符串会出错的。是数组,必须转换成字符串,用函数implode即可,该函数用法见官网,更具我的项目代码如下。

  1. public function download() {
  2. // 输出Excel文件头
  3. //解决IE,firework等浏览器文件名乱码问题
  4. $filename = '已拆回款数据.csv';
  5. $newarray=array();该结果是一个二维数组
  6. if ($this->input->get () !== false) {
  7. $conn = $this->getformdata ();
  8. }
  9. // 输出Excel列名信息
  10. $head = array (
  11. 'ID',
  12. '回款号',
  13. '回款金额(分)',
  14. '调整渠道成本',
  15. '回款时间',
  16. '导入SO时间',
  17. '渠道名称',
  18. '合同ID'
  19. );
  20. foreach ( $head as $i => $v ) {
  21. // CSV的Excel支持GBK编码,一定要转换,否则乱码
  22. $head [$i] = utf2gbk($v);
  23. }
  24. $newarray[]=implode(',',$head);
  25. $sql = "select * from sinapay_boss_income where {$conn} order by income_status asc, boss_income_id desc";
  26. $query = $this->db->query ( $sql );
  27. // 计数器
  28. $cnt = 0;
  29. // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
  30. $limit = 8000;
  31. foreach ( $query->result_array () as $row ) {
  32. $cnt ++;
  33. if ($limit == $cnt) { // 刷新一下输出buffer,防止由于数据过多造成问题
  34. ob_flush ();
  35. flush ();
  36. $cnt = 0;
  37. }
  38. // 读取表数据
  39. $content = array ();
  40. $content [] =$row ['boss_income_id'];
  41. $content [] =$row ['income_num'];
  42. $content [] =$row ['income_amount'];
  43. $content [] =$row ['modified_cost'];
  44. $content [] =$row ['income_date'];
  45. $content [] =$row ['write_so_month'];
  46. $content [] =utf2gbk($row ['channel_name']);
  47. $content [] =utf2gbk($row ['income_contract_id']);
  48. $newarray[]=implode(',',$content);
  49. }
  50. $newarray=implode("\n",$newarray);
  51. force_download($filename, $newarray);
  52. }
  53. }

3.测试后我发现ie浏览器文件名是乱码,firefox 浏览器文件名也是乱码。于是对辅助函数做了以下的修改,以下加了背景颜色的代码是我添加的。

  1. if ( ! function_exists('force_download'))
  2. {
  3. function force_download($filename = '', $data = '')
  4. {
  5. if ($filename == '' OR $data == '')
  6. {
  7. return FALSE;
  8. }
  9. //ie 浏览器解决文件名是乱码
  10. $filename = urlencode($filename);
  11. $filename = str_replace("+", "%20", $filename);
  12. // Try to determine if the filename includes a file extension.
  13. // We need it in order to set the MIME type
  14. if (FALSE === strpos($filename, '.'))
  15. {
  16. return FALSE;
  17. }
  18. // Grab the file extension
  19. $x = explode('.', $filename);
  20. $extension = end($x);
  21. // Load the mime types
  22. @include(APPPATH.'config/mimes'.EXT);
  23. // Set a default mime if we can't find it
  24. if ( ! isset($mimes[$extension]))
  25. {
  26. $mime = 'application/octet-stream';
  27. }
  28. else
  29. {
  30. $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
  31. }
  32. // Generate the server headers
  33. if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
  34. {
  35. header('Content-Type: "'.$mime.'"');
  36. header('Content-Disposition: attachment; filename="'.$filename.'"');
  37. header('Expires: 0');
  38. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  39. header("Content-Transfer-Encoding: binary");
  40. header('Pragma: public');
  41. header("Content-Length: ".strlen($data));
  42. }elseif(strstr($_SERVER['HTTP_USER_AGENT'], "Firefox")){   //解决firefox 文件名乱码
  43. header('Content-Type: "'.$mime.'"');
  44. header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
  45. header('Expires: 0');
  46. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  47. header("Content-Transfer-Encoding: binary");
  48. header('Pragma: public');
  49. header("Content-Length: ".strlen($data));
  50. }else
  51. {
  52. header('Content-Type: "'.$mime.'"');
  53. header('Content-Disposition: attachment; filename="'.$filename.'"');
  54. header("Content-Transfer-Encoding: binary");
  55. header('Expires: 0');
  56. header('Pragma: no-cache');
  57. header("Content-Length: ".strlen($data));
  58. }
  59. exit($data);
  60. }
  61. }

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

  1. HTTP 下载文件中文文件名在 Firefox 下乱码问题

    转自:http://www.imhdr.com/991/ HTTP 下载文件,中文文件名在 Firefox 下乱码问题 最近帮助一同事解决 HTTP 下载文件时,中文文件名在 Firefox 下乱码的 ...

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

    网络上搜索下,发现都不适合 最终改写代码: FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br= n ...

  3. 使用JavaScript下载csv文件

    前端可以使用JavaScript在客户端下载包含页面数据的文件,这里以下载CSV格式文件为例,代码如下: function downloadData(data, filename, type) { v ...

  4. HTML save data to CSV or excel

    /********************************************************************************* * HTML save data ...

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

    Linux系统下利用wget命令把整站下载做镜像网站 2011-05-28 18:13:01 | 1次阅读 | 评论:0 条 | itokit  在linux下完整的用wget命令整站采集网站做镜像 ...

  6. Mac上利用Aria2加速百度网盘下载

    百度网盘下载东西的速度那叫一个慢,特别是大文件,看着所需时间几个小时以上,让人很不舒服,本文记录自己在mac上利用工具Aria2加速的教程,windows下思路也是一样! 科普(可以不看) 这里顺带科 ...

  7. Use JavaScript to Export Your Data as CSV

    原文: http://halistechnology.com/2015/05/28/use-javascript-to-export-your-data-as-csv/ --------------- ...

  8. [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 ...

  9. js实现使用文件流下载csv文件

    1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...

随机推荐

  1. no branch 问题

    现象如下: lynn.feng:~/project/Git/M_MT6737_MP$ git branch -a* (no branch) a36_panasonic_l004 b36_panason ...

  2. out 传值

    public void Out(out int a, out int b) {//out相当于return返回值 //可以返回多个值 //拿过来变量名的时候,里面默认为空值 a=1; b=2; } s ...

  3. zookeeper系列之二—zookeeper历史

    Zookeeper是什么? Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby的一个开源版本.它是为分布式应用提供一致性服务的软件,提供的功能包括:配置服 ...

  4. .Net面試題

    初级.NET开发人员 - 任何使用.NET的人都应知道的 1. 描述线程与进程的区别? 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在.进程可以定义程序的 ...

  5. [51NOD1065] 最小正子段和(STL,前缀和)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 估计没人这么做吧-用一个set维护前缀和,但是set的l ...

  6. [HDU5727]Necklace(二分图最大匹配,枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5727 题意:有N个阴珠子和N个阳珠子,特定序号的阴阳珠子放在一起会让阳珠子暗淡.现在问排放成一个环,如 ...

  7. JavaScript语法(一)

    JavaScript 用法 HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 & ...

  8. Beaglebone Black– 智能家居控制系统 LAS - 刷 WiFi 模块 ESP8266 Firmware 和 ESP8266 直接收发 GPIO 信号

    用 Windows 来刷 ESP8266 固件有很多中文教程,来试试直接用 BBB 刷吧.目标是 NodeMCU,ESP-01 可用,就是我买的那个. 接线方式在上一篇.当 echo ‘BB-UART ...

  9. 可以考虑使用SublimeText编辑器替代notepad++了

    大概是去年吧,这款编辑器神一般的出现在我面前,经过我小心翼翼的试用后发现并不是那么太顺手,插件配置都不太成熟,如Package Control. 最喜欢用它的zencoding还得专门开个小窗:ang ...

  10. Expression Blend制作自定义按钮(转)

    来源:http://www.cnblogs.com/iChina/archive/2011/11/25/2262854.html Expression Blend制作自定义按钮 1.从Blend工具箱 ...