« 上一篇下一篇 »

php生成txt文件时的坑

【1】文件实际路径和URL路径

由于www服务器的根相对于操作系统的/目录有一定的深度,

所以,php输出文件的URL和实际路径是不一样的,

比如:

$www_base = '/data/www';

$url_path = '/some/output/path';

那么,

实际文件名是 ‘/data/www/some/output/path/filename’

而URL文件名是 ‘/some/output/path/filename’

所以,

用fopen($file_name,"w") or die("Error Msg"); 创建文件的时候,

file_name 需要用全路径的文件名,实际路径,而不是输出文件在www服务里的URL部分。

而在网页里用 a href="url_to_file" 让用户下载文件的时候,则应该使用URL文件名。


【2】换行回车字符问题

在php里使用\n可以换行,

但是,输出到txt文件的时候,却直接输出了\和n两个字符,

无论使用单引号还是双引号给输出到文章体里。

所以,换个思路,用 chr() 函数,

将换行回车(0x0D 和 0x0A)转为字符,应用在文件内容里:

$lfrt = chr(10).chr(13);  

//(0x0D 和 0x0A的十进制转成ASCII码字符 )


【3】输出UTF-8文件 需要BOM头的问题

网站php使用UTF-8编码来汉字,生成的txt文件未包含BOM头部,

为了让Windows软件识别,需要在第1-3个字节写入BOM标志:EF BB BF

否则Windows程序会以ANSI编码打开该txt文件,出现乱码。

所以,第一步就要在文件内容里写入efbbbf

$csv_data = chr(hexdec(EF)).chr(hexdec(BB)).chr(hexdec(BF));


【4】文件清理删除

例:

将/data/www/huge_pic 目录下所有1天前的csv文件删除

(可将该语句写入crontab,定期自动清理)


  find /data/www/huge_pic -ctime +1 -name "*.csv" -exec rm -rf {} \;


  /data/www/huge_pic:想要进行清理的任意目录

  -mtime:更改时间,天,可以为-ctime 创建时间或 -atime 访问时间

  +1:查找1天之前前的文件,-7表示7天之内,+30表示查找30天前的文件

  "*.*":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有、、

  -exec:固定写法

  rm -rf:强制删除文件,包括目录

  {} \; :固定写法,一对大括号+空格+\