文件上传乱码问题

li_xiufang 2012-05-29 11:28:36
我文件名是中文,传到servlet里就变成????怎么转都转不回来。。高手指点下

public String upFile() throws Exception{
String targetURL = null;// TODO 指定URL
File targetFile = null;// TODO 指定上传文件
System.out.println(config.getPath());
String str= new String(config.getPath().getBytes("iso8859-1"), "utf-8");
config.setPath(str);

targetFile = new File(config.getPath());
targetURL = "http://localhost:8081/ftoa/upload"; //servleturl
PostMethod filePost = new PostMethod(targetURL);
System.out.println(targetFile);
System.out.println(config.getPath());
System.out.println(filePost);
try
{
//通过以下方法可以模拟页面参数提交
// filePost.setParameter("name", "中文");
// filePost.setParameter("pass", "1234");
System.out.println(targetFile.getName());
Part[] parts = { new FilePart(targetFile.getName(), targetFile) };
filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));

HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if (status == HttpStatus.SC_OK)
{
System.out.println("上传成功");
configService.updataInfo(config);
// 上传成功
}
else
{
System.out.println("上传失败");
// 上传失败
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
filePost.releaseConnection();
}
return null;
}






public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
try
{
File tempfile = new File(System.getProperty("java.io.tmpdir")); // 采用系统临时文件目录
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempfile);// 设置缓冲区目录 tempPathFile
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB
List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 文件名是????
Iterator<FileItem> i = items.iterator();
while (i.hasNext())
{
FileItem fi = (FileItem) i.next();
fi.getString("UTF-8");
String fileName = fi.getName();

// response.setHeader("Content-disposition", "attachment;filename="
// + URLEncoder.encode(fileName, "UTF-8"));

String str= new String(fileName.getBytes("ISO8859_1"), "utf-8");
fileName=str;
System.out.println(fileName);//都是问号?????.txt
if (fileName != null)
{
File fullFile = new File(fi.getName());
File savedFile = new File(uploadPath, fullFile.getName());
fi.write(savedFile);
}
}
System.out.print("upload succeed");
}
catch (Exception e)
{
System.out.println(e.getMessage());
// 可以跳转出错页面
e.printStackTrace();
}
}



这个问题卡很久了,希望大家帮帮忙
...全文
731 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_xiufang 2012-06-05
  • 打赏
  • 举报
回复
我发现在mian方法里直接执行 action里的代码中文虽然也是乱码(有点象繁体字)但是可以转的过来,但是如果先访问action再到servlet 中文就转不过来了都是(????.txt).很奇怪啊
就算加了 client.getParams().setContentCharset("utf-8");
client.getParams().setHttpElementCharset("utf-8");
也没用,servlet收到的编码是utf-8 但是中文就是????.txt
wqkjj 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

浏览器访问action (upFile())的时候也是乱码通过String str= new String(config.getPath().getBytes("iso8859-1"), "utf-8"); 转码后才正常显示,之后发送
targetURL = "http://localhost:8081/ftoa/upload"; //servleturl
到servlet的时候 Li……
[/Quote]

你的应用是要经过两个服务器? C-->S-->S,然后在第二个S上出现乱码了?
你在转发目标targetURL时,文件名称是不是还是以iso8859-1发送的?发送之前转换成UTF8咯,然后在第二个S处将文件名称再从utf8转换成OS的字符集。
wumingmao1990 2012-05-31
  • 打赏
  • 举报
回复
会不会和httpclient包有关系
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
浏览器访问action (upFile())的时候也是乱码通过String str= new String(config.getPath().getBytes("iso8859-1"), "utf-8"); 转码后才正常显示,之后发送
targetURL = "http://localhost:8081/ftoa/upload"; //servleturl
到servlet的时候 List<FileItem> items = upload.parseRequest(request);// 这里接收的时候文件名称又变成乱码了(主要是这里不知道怎么转回来)
主要是fileName是乱码
注水的牛 2012-05-30
  • 打赏
  • 举报
回复
既然平台编码是utf-8,那么就不需要编码转换了哇,
getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中;
getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中;
String(byte[] bytes, Charset charset)通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String;
String(byte[] bytes)通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String;
可不可以String str = new String(config.getPath().getBytes());
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
点击windows->preferences->general->workspace,看看text file encoding是不是UTF-8
[/Quote]

也是utf-8
注水的牛 2012-05-30
  • 打赏
  • 举报
回复
点击windows->preferences->general->workspace,看看text file encoding是不是UTF-8
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:

引用 5 楼 的回复:
把JSP页面的ENCODING的值改为utf-8呢,不用默认的编码方式。

没有jsp界面,直接访问action而且我在upFile()已经把编码改成utf-8了啊,为什么传到servlet还是乱码呢


右击整个项目,在properties中得resource中直接将text file encoding设置成UTF-8,或者在取值……
[/Quote]
我的项目用的就是utf-8的,而且我在servlet里也已经加了
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
没什么用
注水的牛 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
把JSP页面的ENCODING的值改为utf-8呢,不用默认的编码方式。

没有jsp界面,直接访问action而且我在upFile()已经把编码改成utf-8了啊,为什么传到servlet还是乱码呢
[/Quote]

右击整个项目,在properties中得resource中直接将text file encoding设置成UTF-8,或者在取值之前转编码request.setCharacterEncoding("utf-8");。
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
把JSP页面的ENCODING的值改为utf-8呢,不用默认的编码方式。
[/Quote]
没有jsp界面,直接访问action而且我在upFile()已经把编码改成utf-8了啊,为什么传到servlet还是乱码呢
注水的牛 2012-05-30
  • 打赏
  • 举报
回复
把JSP页面的ENCODING的值改为utf-8呢,不用默认的编码方式。
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
字符集转换问题。
浏览器是不是以UTF8上传的啊,看看浏览器设置。
找一个字符串转换工具按照utf8转换,比较一下你收到的字符串是否和转换结果相同。
[/Quote]
浏览器访问upFile()的时候,我在这里就转换成UTF-8了,然后连接servlet的时候文件名又变成乱码了,都是问号,试了各种转换都转不回来
wqkjj 2012-05-30
  • 打赏
  • 举报
回复
字符集转换问题。
浏览器是不是以UTF8上传的啊,看看浏览器设置。
找一个字符串转换工具按照utf8转换,比较一下你收到的字符串是否和转换结果相同。
li_xiufang 2012-05-30
  • 打赏
  • 举报
回复
都没人了
li_xiufang 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
是jsp和Servlet之间吗?还是就一个Servlet。
[/Quote]
没用jsp 客户端直接发送
fw347969680 2012-05-29
  • 打赏
  • 举报
回复
是jsp和Servlet之间吗?还是就一个Servlet。

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧