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

问题描述:项目组在使用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,我的服务器是默认包含的。

至此结束!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值