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. 水流雨渍shader

    战神斯巴达之魂的雨渍做的很逼真,尝试了下,似乎是差不多了,整体欠缺不少 普通平面: 环形流动: 河流: shader实现,3层加上一个偏移层 圆形的雨渍流动和河流要重新展一下UV

  2. python学习笔记-day4笔记 常用内置函数与装饰器

    1.常用的python函数 abs             求绝对值 all               判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any          ...

  3. HDU(2089),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others ...

  4. An Easy C Program Problem

    找幸运数 题目描述 数字8最多的那个数为幸运数. 输入n和n个整数,找这n个数中的幸运数.在主函数中调用ndigit函数,判断某个整数x含数字8的个数.如果有多个幸运数输出第一个幸运数,如果所有的数中 ...

  5. mean函数

    求平均值 th> a=torch.zeros(,) [.0002s] th> a [torch.DoubleTensor of size 1x3] [.0003s] th> a[{, ...

  6. 将linux默认python升级到2.7.4版本

    第一步:下载python2.7.4版本源码: wget http://python.org/ftp/python/2.7.4/Python-2.7.4.tgz 解压文件 [aa@localhost ~ ...

  7. 模块mod_h323的编译

    去h.323plus官网上下载关联的库 http://www.h323plus.org/source/ 很贴心,分操作系统下载,而且关联的ptlib库的版本也一并列了出来. 一.编译ptlib库 ex ...

  8. echo输出到stderr

    echo "Your error message here" >&2 This is a normal echo (which goes to stdout), ho ...

  9. hihoCoder太阁最新面经算法竞赛17

    比赛链接:http://hihocoder.com/contest/hihointerview26 A.排序后枚举两个点,确定一个矩形后二分剩下两个点. #include <bits/stdc+ ...

  10. [Java解惑]字符串

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