文件上传到linux服务器 文件名为乱码

文件上传到linux服务器 文件名为乱码

问题描述:

我在windows系统 用fileupload上传包含中文文件名的文件,
上传到linux服务器后文件名为乱码。

我用乱码字符串做 GBK转UTF-8可以变为正常
原本想在上传后先用程序重命名一遍UTF-8转GBK的文件名,但是出现了另外一种乱码。

请教知道这个问题的解决方法或原因,谢谢。

另外我用程序创建一个文件也会出现这种乱码。

你的shell的编码字符集呢?为啥乱码是你想要的。。。。。可以先把shell设置成utf-8再看看 你java传上去的竟然还是GBK的。。。太假了

commons-fileupload?windows默认的字符集是GBK或GB2312,inux默认utf-8
一般上传的时候设置下字符集 setHeaderEncoding("UTF-8");

这问题我在aix系统下也遇到过,至今没有解决。

保存文件之前需要对文件名进行编码转换。

[code="java"]
//假设 filename 为得到的上传文件名
String newFilename = new String(filename.getBytes("GBK"), "UTF-8");
File newFile = new File(newFilename);

//然后将流写入 newFile

[/code]

[quote]
我用乱码字符串做 GBK转UTF-8可以变为正常
原本想在上传后先用程序重命名一遍UTF-8转GBK的文件名,但是出现了另外一种乱码。
[/quote]

你是做了两次编码吗?

还有,你 Linux 系统的编码是不是 UTF-8 ?

你的linux系统的编码是什么格式? 在代码里有输出过文件名 正常的么?

= = 这个真莫名 那你用来上传文件的java代码文件的编码格式呢?utf-8的么

这个应该是和系统相关的,因为我同样在Windows下就没有这种情况。我也经过多番的转换编码也是没有作用。常用的编码也就那么几种,怎么转换也应该可以的,我觉得造成乱码的另有原因。

我在Spring的配置文件中做了如下配置,现在可以了



2048000


2048


UTF-8

肯定还有哪里没考虑到。。。。。web服务器的字符集呢?

兄弟你是不是用ssh连接过去的,有可能是你ssh的客户端编码导致你看到的是乱码,实际不是啊,还有就是打印出来的也有可能,你这问题我以前经常见啊,都能解决的,在代码中调试就行。

你用的Commons-fileupload嘛,我用的是SpringMVC带的MultipartResolver。

FTP 的话,现在有很多客户端都支持自动检测 UTF-8 的:如果服务器端支持 UTF-8,则上传文件时自动转换文件名。

其实最好的方法是调试。下几个断点分别看看接收文件时的文件名、编码后的文件名、写入磁盘后的文件名。

weblogic则是在weblogic.xml里
jboss在server/default/deploy/jbossweb.sar/server.xml里
不知道管不管用。。。。

[quote]if(item.getFieldName().equals("picpath")){
upload = item.getName();
if (upload.length()>0) {
fileName = upload.substring(upload.lastIndexOf("\")+1,upload.length());
temfile = new File(tarpath+filenametemp+"/zip/"+fileName);
item.write(temfile); [/quote]

temfile 的文件名是什么?输出来看看

我用的是ModelAttribute,写一个Model,里面有MultipartFile类型的变量。代码在家里的电脑里面,没法发给你。

你是怎么创建的,文件名是从浏览器输入的还是怎么赋的文件名

。。。。。还没搞定

是不是linux支持的字符集的问题,按道理utf-8支持就ok了的啊。。。linux服务器啥系统啊

那就怪了,我的代码直接创建文件却不是乱码,你怎么查看到服务器上的文件的.通过Telnet还是ssh客户端看的.

我曾经用Xshell连接Linux,看到里面的中文文件名为乱码,我以为服务器出问题了,去找公司配置人员,人家改了一下Xshell的字符集就ok了.

[url]http://www.iteye.com/topic/1117615[/url]
这篇文章你看一下,讲java的编码机制的,文章挺长,耐下性子看一下吧,我看了一般,还没看完。

[quote]sqliconv: illegal input sequence at position 3
tomcat@Staging ~/webapps/CommonManagerPlatform/temptar2/eb19dbf9-476d-4797-98d7-b89139514434/files $ iconv -f gbk -t utf-8 sql查询语句.txt
sql查询语句.txt [/quote]
。。。。。这是什么情况,这不是说明你sql查询语句.txt是GBK的么。。。。不过你文件名在shell里不是正常的么 奇怪

你看看是不是你的 SecureCRT 里面的字符集没胡设置好?如果 server 是 utf-8 的话,SecureCRT 里面也必须是 utf-8。我平时使用的是 putty, 需要设置 utf-8 的。

你一直犯了一个很大的错误:

[quote]如下是我转吗的语句和结果
iconv -f utf-8 -t gbk sql查询语句.txt
sqliconv: illegal input sequence at position 3 这时出现了问题(可能说明我写到服务器的文件转码的时候出错了)
iconv -f gbk -t utf-8 sql查询语句.txt
sql查询语句.txt [/quote]

你这个命令是用 iconv 转换 sql查询语句.txt 文件的 [b][u]内容[/u][/b],而不是文件名。根据错误提示,说明该文件内容是GBK码的。

文件名显示是正确的啊,说明问题不在文件名这里