php导出csv文件

要先谈谈

Content-Disposition的作用

  开头打印的信息中有Content-Disposition,一时好奇,所以了解了一下。顺便学习一下文件上传所需要的注意事项。

      Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)   

        服 务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户 保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");

备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下:

header("Content-Type: text/csv;charset=utf-8");
header("Content-Disposition: attachment; filename=log".date("Y-m-d_H:i:s").".csv");
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');

不然会发现下载功能在operafirefox里面好好的没问题,在IE下面就是不行,就是找不到文件。

 

在谈谈

文件编码问题,如果charset指定utf-8,最好用于生成csv的php文件也是utf-8,数据库也是utf-8的,这样就避免在php中编码转换。

另一值得注意的地方就是这样csv本来就是txt文档,用逗号分割而已,所以传输到本地的也是uft-8的,很多人都是用excel打开csv文件这时候发现打开的是乱码。

这是因为excel默认是gbk编码打开的,要让excel识别utf-8编码就要在传输的时候添加一个BOM头,就是在ie6下会导致首行空一行的东西,也是导致session_star()执行报错的东西。

说这个问题之前首先来说一下什么是CSV文件?Comma Separator Value(逗号分隔值)是也。常常用来数据转换的中间文件存在,比如:从Mysql中导出数据到CSV,导入CSV到SqlServer中。在 Linux下用PHP脚本从Mysql数据库中将表的数据按照条件导出成csv,使用utf-8编码导出CSV文件,打开后里边的中文成了乱码 (Windows下CSV文件默认与Microsoft Excel关联),用Notepad++或者Word打开正常,不过排版很乱。原因:BOM惹的祸,微软惹的祸。

什么是BOM?Byte Order Mark(比特序标记)是也。

   为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头。这作为一个"特征符"或"字节顺序标记(byte-order mark,BOM)"来识别文件中使用的编码和字节顺序(big-endian或little-endian),具体的对应关系见下表。 
Bytes 
Encoding Form 
00 00 FE FF UTF-32, big-endian 
FF FE 00 00 UTF-32, little-endian 
FE FF UTF-16, big-endian 
FF FE UTF-16, little-endian 
EF BB BF UTF-8

类Unix系统中并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

实现代码如果

<?php

$str = "哈,哈,哈,哈"; copyright phphc.com

$fp = fopen("a.csv","a"); 本文来自PHPHC

//在写入数据之前先把bom头写到文件里

fwrite($fp,"\xEF\xBB\xBF");

//再写入数据

fwrite($fp,$str); 本文来自PHPHC

fclose($fp); 本文来自PHPHC

?>

以上是直接写文件的方式,输出的方式是 echo "\xEF\xBB\xBF";

注:在写csv文件时确保php源码是utf-8,并且无BOM,并且没有输出任何内容。BOM实际上挺烦人,如果你的网页(*.html)有BOM,在IE6.x下面打开会发现一神奇的空行,Firefox下却没有

 

最后注意一个小白的问题,我就犯了这个错,excel里的和csv的换行,是使用'\n'的,在php中不管你前面的输出什么,要换行是要使用echo "\n",注意这里的双引号,不然不会转义,直接当\n字符串输出了。

posted on 2012-08-23 14:52  kudosharry  阅读(1077)  评论(0编辑  收藏  举报

导航