关于PHP文件下载乱码(损坏)的问题

pywepe 2010-12-29 11:55:01
帮系做了一个网站,有一个上传资源和下载资源的模块.

部署在我机器上时,上传上去的文件下载来下都是没有问题的(doc,txt...都正常).

但部署到服务器上去(win server 2003),文件下载下来都是乱码的,除了只有英文的txt文件.

服务器上的用的是apache2.2 php5,而且php5的HOME是用我机器上的HOME覆盖的.

请教大家,这个问题的原因是什么?(系统文件编码?)
怎么解决这个问题?

谢谢.急...
...全文
309 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppaass1 2011-09-14
  • 打赏
  • 举报
回复
编码问题,你看看下载的文件的二进制开头是不是多了EF BB BF,如果是的话,是因为php 不支持utf8 bom造成的。
pywepe 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 skyaspnet 的回复:]

php上传中文文件名乱码解决方案,你试一下如下代码,需要进行转码:

PHP code

$image_name = mktime().mt_rand(10000,100000).$_FILES['file']['name']; //图像的新名字
move_uploaded_file($_FILES['file']['tmp_name'],iconv("UTF-8", "gb2312", ……
[/Quote]

全当二进制处理 应该就可以吧
pywepe 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zy205817 的回复:]

你先用虚拟机试试看看,看有乱码没有!
[/Quote]

我也用了 虚拟机不乱码
skyaspnet 2010-12-30
  • 打赏
  • 举报
回复
php上传中文文件名乱码解决方案,你试一下如下代码,需要进行转码:


$image_name = mktime().mt_rand(10000,100000).$_FILES['file']['name']; //图像的新名字
move_uploaded_file($_FILES['file']['tmp_name'],iconv("UTF-8", "gb2312", BASEIMAGEPATH.'/'.$image_name)); //移动图像


主要需要搞清楚上传文件时如果文件名里有中文需要进行相应的转码
ihefe 2010-12-30
  • 打赏
  • 举报
回复
编码问题。
系统编码 ide工具编码
君望永远 2010-12-30
  • 打赏
  • 举报
回复
服务器Apache设置编码了么
还有是不是服务器缺少字体啊
码无边 2010-12-30
  • 打赏
  • 举报
回复
你先用虚拟机试试看看,看有乱码没有!
pywepe 2010-12-30
  • 打赏
  • 举报
回复
没人回答 没人遇到过这样的问题??? 这可是100分
shyokou 2010-12-30
  • 打赏
  • 举报
回复
譬如在 header 中加上 "Content-Type: text/html; charset=utf-8" 就是一种强制方式 ...

[Quote=引用 19 楼 pywepe 的回复:]

主要是下面的代码:
PHP code
$fn = array_pop( explode( '/', strtr( $this->filename, '', '/' ) ) );
header( "Pragma: public" );
header( "Expires: 0" ); // set expiration time
h……
[/Quote]
shyokou 2010-12-30
  • 打赏
  • 举报
回复
查查浏览器的编码设置, 未在服务器方强制时可能会不是所希望的 ...

[Quote=引用 16 楼 pywepe 的回复:]

引用 15 楼 shyokou 的回复:

乱码的问题根源在于编码没有统一为 i18n 规范的 UTF-8 之类的 Unicode 编码, 最好避免用 "skyaspnet" 所介绍的 iconv 将 UTF-8 转换为 GB 码, 因为这可以说是技术上的倒退, 干吗不同意为 UTF-8 呢, 从 Apache 设置开始强制默认编码 UTF-8 再在 header 和 meta 等处都强化之……
[/Quote]
pywepe 2010-12-30
  • 打赏
  • 举报
回复
主要是下面的代码:
		$fn = array_pop( explode( '/', strtr( $this->filename, '', '/' ) ) );
header( "Pragma: public" );
header( "Expires: 0" ); // set expiration time
header( "Cache-Component: must-revalidate, post-check=0, pre-check=0" );
header( "Content-type:".$this->mineType );
header( "Content-Length: " . filesize( $this->filename ) );
header( "Content-Disposition: attachment; filename=" . $this->fileDesc . "." . $this->filetype );
header( 'Content-Transfer-Encoding: binary' );
readfile( $this->filename );
return true;
pywepe 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 meteorlet 的回复:]

文件是二进制的内容,同样的内容无论在哪里都是一样的。
其实文件下载跟编码没有关系的,但是你做法有问题所以跟编码就有关系了。

做法1: http://localhost/download.php?file=xxxx.doc
做法2: http://localhost/document/xxxx.doc

我猜你肯定用的是第二种做法,因为doc文件不是动态网页,所以当成文本打开,内容的……
[/Quote]

我用的是做法1:
http://192.168.131.131/ied/down.php?dn_id=35
Meteorlet 2010-12-30
  • 打赏
  • 举报
回复
文件是二进制的内容,同样的内容无论在哪里都是一样的。
其实文件下载跟编码没有关系的,但是你做法有问题所以跟编码就有关系了。

做法1: http://localhost/download.php?file=xxxx.doc
做法2: http://localhost/document/xxxx.doc

我猜你肯定用的是第二种做法,因为doc文件不是动态网页,所以当成文本打开,内容的编码用缺省的ISO编码,这样肯定是乱码了。如果是第一种做法就不会有这个问题。如果非要采用做法2的话,可以改doc的MIME格式定义。配置如下:
AddType application/microsoft .xls .doc .ppt .mdb
pywepe 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 shyokou 的回复:]

乱码的问题根源在于编码没有统一为 i18n 规范的 UTF-8 之类的 Unicode 编码, 最好避免用 "skyaspnet" 所介绍的 iconv 将 UTF-8 转换为 GB 码, 因为这可以说是技术上的倒退, 干吗不同意为 UTF-8 呢, 从 Apache 设置开始强制默认编码 UTF-8 再在 header 和 meta 等处都强化之, 浏览器方会自动按照这样的设置适应 UTF-8……
[/Quote]

恩,是的,就是浏览器下载下来的文件,打开时乱码
shyokou 2010-12-30
  • 打赏
  • 举报
回复
乱码的问题根源在于编码没有统一为 i18n 规范的 UTF-8 之类的 Unicode 编码, 最好避免用 "skyaspnet" 所介绍的 iconv 将 UTF-8 转换为 GB 码, 因为这可以说是技术上的倒退, 干吗不同意为 UTF-8 呢, 从 Apache 设置开始强制默认编码 UTF-8 再在 header 和 meta 等处都强化之, 浏览器方会自动按照这样的设置适应 UTF-8 编码的; 非浏览器譬如被微软强制为 l10n 的命令提示符之类的才需要用 iconv 转换呢 ...

假设您说的 "下载" 是指浏览器 ...

[Quote=引用楼主 pywepe 的回复:]
帮系做了一个网站,有一个上传资源和下载资源的模块.

部署在我机器上时,上传上去的文件下载来下都是没有问题的(doc,txt...都正常).

但部署到服务器上去(win server 2003),文件下载下来都是乱码的,除了只有英文的txt文件.

服务器上的用的是apache2.2 php5,而且php5的HOME是用我机器上的HOME覆盖的.

……
[/Quote]
冬雨在路上 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 skyaspnet 的回复:]
php上传中文文件名乱码解决方案,你试一下如下代码,需要进行转码:


PHP code

$image_name = mktime().mt_rand(10000,100000).$_FILES['file']['name']; //图像的新名字
move_uploaded_file($_FILES['file']['tmp_name'],iconv("UTF-8", "gb2312……
[/Quote]
应该可以了吧
pywepe 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yangball 的回复:]

不好意思,当我说没过。。。。
[/Quote]

??
床上等您 2010-12-29
  • 打赏
  • 举报
回复
不好意思,当我说没过。。。。
床上等您 2010-12-29
  • 打赏
  • 举报
回复
那就是编码的问题了 ,输出时转一下编码
pywepe 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fxs_2008 的回复:]

要看是文件名乱码还是文件乱码
[/Quote]

文件内容乱码

文件名不乱码
加载更多回复(1)

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧