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. js九九乘法表

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  2. size函数

    size是求第一维度的大小 size(2)是求第二维度的大小

  3. 华东交通大学2016年ACM“双基”程序设计竞赛 1005

    Problem Description 最近侯ry感觉自己在数学方面的造诣不忍直视:他发现他的学习速率呈一个指数函数递增,疯狂的陷入学习的泥潭,无法自拔:他的队友发现了他的学习速率y=e^(b*lna ...

  4. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5878

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 解法:先保存,再二分查询~具体http://blog.csdn.net/coder_xia/arti ...

  5. IMetadataAware接口的特性定制Model元数据

    第一步创建元数据类 using System; using System.Collections.Generic; using System.Linq; using System.Reflection ...

  6. CF 321B Ciel and Duel(费用流)

    题目链接:http://codeforces.com/problemset/problem/321/B 题意:两个人,分别有n.m张牌.每张牌有两个属性类型和能力,类型为攻击或者防守.B的m张牌的属性 ...

  7. Windows控制台程序“选定模式”的问题

    最近用Nodejs写了个代理程序,一直用的好好的,木有问题,今天突然发现不能用了,使用telnet去连代理的端口也能连通,可是服务就是不能正常使用,提示连接超时. 当时猜测是Nodejs的某个地方阻塞 ...

  8. PostgresSql开放局域网访问

    1) 确认已经退掉所有的MASF终端和MSF GUI,然后打开PostgresSQL的启动文件在文件POSTGRESQL_START参数后面添加-h 0.0.0.0,让PostgreSQL启动时绑定到 ...

  9. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. C# 操作的时候接收用户输入密码进行确认

    首先新建一个原始窗体,如下: