windows共享目录。开发完成后遇到一个问题,项目部署在windows时上传文件没有问题,当部署在centos时,上传的文件名包含中文时,上传就会失败。
报错如下:
java.io.FileNotFoundException: /mnt/file/2018/01/151572394068250模板.xls (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.(FileOutputStream.java:213)
at java.io.FileOutputStream.(FileOutputStream.java:162)
at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:417)
at org.springframework.web.multipart.commons.CommonsMultipartFile.transferTo(CommonsMultipartFile.java:143)
找了一圈资料,把centos的字符集、tomcat中server.xml中的“URIEncoding”都更改为UTF-8之后还是不成功。最终在tomcat/bin/catalina.sh文件中增加了“export LANG=zh_CN.UTF-8”,成功解决了问题。
前端文件上传组件使用的是easyui,后端文件保存使用的是SpringFramework的MultipartFile API。
语言locale解析
而为什么上传的中文名文件保存起来以后文件名会乱码呢?这是因为Windows的默认编码为GBK,Linux的默认编码为UTF-8。在Windows下编辑的中文,上传到Linux下就会显示为乱码。为了解决此问题,修改Linux的默认编码为GBK,就能够成功的解决乱码问题。
首先运行locale查看本地编码方式:
方式一:
[root@localhost hins]# locale
LANG=en_US.UTF-8
LC_CTYPE=“en_US.UTF-8”
LC_NUMERIC=“en_US.UTF-8”
LC_TIME=“en_US.UTF-8”
LC_COLLATE=“en_US.UTF-8”
LC_MONETARY=“en_US.UTF-8”
LC_MESSAGES=“en_US.UTF-8”
LC_PAPER=“en_US.UTF-8”
LC_NAME=“en_US.UTF-8”
LC_ADDRESS=“en_US.UTF-8”
LC_TELEPHONE=“en_US.UTF-8”
LC_MEASUREMENT=“en_US.UTF-8”
LC_IDENTIFICATION=“en_US.UTF-8”
LC_ALL=
方式二:
[root@localhost hins]# echo $LANG
zh_CN.GBK
这是服务器默认的编码,根据后面的方法修改后应该为:
(我修改为GBK以后的linux服务器的编码)
方法如下:
方法1:(试了一下,编码方式没有改变,可能是要重启服务器才能生效)
vi /etc/sysconfig/i18n
默认为:
LANG=“en_US.UTF-8”
SYSFONT=“latarcyrheb-sun16”
修改为:
LANG=“zh_CN.GBK”
SUPPORTED=“zh_CN.UTF-8:zh_CN:zh”
SYSFONT=“latarcyrheb-sun16”
方法2:(推荐这种方法,不用重启服务器)
vi /etc/profile
export LC_ALL=“zh_CN.GBK”
export LANG=“zh_CN.GBK”
生效:source /etc/profile
[root@localhost hins]# locale
LANG=zh_CN.GBK
LC_CTYPE=“zh_CN.GBK”
LC_NUMERIC=“zh_CN.GBK”
LC_TIME=“zh_CN.GBK”
LC_COLLATE=“zh_CN.GBK”
LC_MONETARY=“zh_CN.GBK”
LC_MESSAGES=“zh_CN.GBK”
LC_PAPER=“zh_CN.GBK”
LC_NAME=“zh_CN.GBK”
LC_ADDRESS=“zh_CN.GBK”
LC_TELEPHONE=“zh_CN.GBK”
LC_MEASUREMENT=“zh_CN.GBK”
LC_IDENTIFICATION=“zh_CN.GBK”
LC_ALL=zh_CN.GBK
二、理解locale的设置
设定locale就是设定12大类的locale分类属性,即 12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。
它们之间有一个优先级的关系:LC_ALL > LC_* > LANG
可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
三 具体设定locale的方法(zh_CN.UTF-8、zh_CN.GBK)
freebsd的设置:
1.GDM登录改为终端登录后startx启动图形桌面
2.在~/.cshrc中增加如下语句,(根据自己使用的shell进行相应设置)
setenv LANG zh_CN.GBK
setenv LC_ALL zh_CN.GBK
setenv LC_CTYPE zh_CN.GBK
3.修改/etc/fstab的默认值:
linux 设置:
1.修改/etc/sysconfig/i18n文件,LANG="zh_CN.UTF-8"或LANG=“zh_CN.GBK”
普通用户修改~/.profile
export LANG zh_CN.GBK
2.修改/etc/fstab的默认值
————————————————
参考原文链接:https://blog.csdn.net/hubo3085632/article/details/79042022
https://blog.csdn.net/Axela30W/article/details/72898054