您的位置:首页 > 编程语言 > PHP开发

解决PHP上传文件中文乱码问题

2015-10-15 20:23 639 查看
问题描述:项目组在使用WSS(White Shark System)官方网站过程中,发现当上传中文文档时,在点击下载时无法下载(显示404NotFound),从显示的URI上可以很明显的看出是由于乱码。

具体信息描述:

服务器:centos+apache+php+mysql

客户端:Windows

解决过程:

由于我在本机上也搭载着一套WSS系统,我尝试了文件上传,没有任何问题。所以我猜想是由于windows和Linux默认字符集不同产生的。

为了验证猜想,我在Linux上上传了一份文档“测试.txt”当然了,还是一如以往的显示404。我把请求的URL拿出来。WSS的上传的文件名显示为:MD5(TIME)_文件名.类型。因此,URL的后半拉即为文件名的URL编码格式。

通过在线编解码,可以看出请求的文件名编码为utf8格式,于是,将“测试”的gb2312格式的编码获取到:%25e6%25b5%258b%25e8%25af%2595,构造一个URI,发现可以获取到文件。

也就是问题的根源在于:在Linux系统上是以gb2312编码存储的,而客户端是以utf8编码请求的。

起初我以为是Linux默认编码是gb2312,使用locale发现,默认语言字符集为:zh-CN utf8。那就奇怪了,为啥会以gb2312格式存储呢?后来一百度才知道,windows默认是以gb2312格式来存储中文。

所以现在的问题就变成了如何把gb2312的变成utf-8格式存储在Linux服务器上?

这个问题比较困难,后来分析发现也没有必要转换,为啥呢?因为windows是以gb2312格式读取文件的。也就是说,一旦浏览器从服务器上把文件下载到本地之后,编码差异的问题就不存在了。

所以现在的问题又变成了,如何使用utf8编码的请求去下载gb2312文件名的文件?

当然了,这个时候没有什么好办法,只能让二者统一,打开PHP代码,找到相应区域(WSS代码组织的非常混乱)。通过iconv(“gb2312”,”utf8//ignore”,$named);将文件名变成utf8格式。

于是请求的时候就可以获取到了,word、excel等等都可以正常下载了。

但是但是但是….

当请求txt文件时,并不是下载下来的,而是直接在页面中打开的。很显然,txt文件是gb2312的,而是以utf-8格式显示的,所以乱码是必然的。

怎么办呢?如果能将txt文件强制下载到客户端而不是显示在浏览器中,问题就迎刃而解了。

怎么做呢?修改Apache的配置文件,添加如下:

<FilesMatch "./txt">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>


同时还有loadModule mod_headers.so,我的服务器是默认包含的。

至此结束!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: