解决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的配置文件,添加如下:
同时还有loadModule mod_headers.so,我的服务器是默认包含的。
至此结束!
具体信息描述:
服务器: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,我的服务器是默认包含的。
至此结束!
相关文章推荐
- vsftp.conf 配置文件详解
- ssh 配置文件讲解大全 ssh调试模式 sftp scp strace进行调试
- TextPicker | 控件文本捕获工具
- PHP利用JPGRAPH画图不显示的解决
- I题 - A+B for Input-Output Practice (VIII)
- H - A+B for Input-Output Practice (VII)
- php获取post中的json数据的实现方法
- G - A+B for Input-Output Practice (VI)
- F题 - A+B for Input-Output Practice (V)
- E题 - A+B for Input-Output Practice (IV)
- PHP文件操作
- php yii多表查询
- thinkphp(2)
- PHP中Stream(流)的概念与用法
- 全面解读PHP的人气开发框架Laravel
- PHP反射
- wamp中升级php版本
- yii2 提示Module not inserted due to validation error.
- 服务器配置(建站助手),使用MSFTP服务器FTP无法连接解决方法
- yii2 提示Module not inserted due to validation error.