fileupload上传中文文件名时乱码问题(转)
原文地址:http://www.blogjava.net/duduli/archive/2008/11/11/239845.html
?
昨天让这个乱码问题弄了很久,一大早就开始想要怎么解决才好。
很简单上传页面,jsp上传页面代码
????<form?action="/struts2/UploadServlet"?method="post"?enctype="multipart/form-data">?
????????用户名:<input?type="text"?name="username"><br>
????????密?码:<input?type="password"?name="password"><br>
????????文件1:<input?type="file"?name="file1"><br>
????????文件2:<input?type="file"?name="file2"><br>
????????<input?type="submit"?value="提交">
????</form>?下面是UploadServlet代码
@SuppressWarnings("serial")
public?class?UploadServlet?extends?HttpServlet?{
????@SuppressWarnings({?"unchecked",?"deprecation"?})
????public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
????????????throws?ServletException,?IOException?{
//????????????设置工厂
????????????DiskFileItemFactory?factory?=?new?DiskFileItemFactory();
????????????String?path?=?request.getRealPath("/upload");
//????????????设置文件存储位置
????????????factory.setRepository(new?File(path));
//????????????设置大小,如果文件小于设置大小的话,放入内存中,如果大于的话则放入磁盘中
????????????factory.setSizeThreshold(1024*1024);
????????????
????????????ServletFileUpload?upload?=?new?ServletFileUpload(factory);
//????????????这里就是中文文件名处理的代码,其实只有一行,serheaderencoding就可以了
????????????upload.setHeaderEncoding("utf-8");
????????????/*String?enCoding?=?request.getCharacterEncoding();
????????????if(enCoding?!=?null){
????????????????upload.setHeaderEncoding(enCoding);
????????????}*/
????????????
????????????try?{
????????????????List<FileItem>?list?=?upload.parseRequest(request);
????????????????for(FileItem?item?:?list){
//????????????????????判断是不是上传的文件,如果不是得到值,并设置到request域中
//????????????????????这里的item.getfieldname是得到上传页面上的input上的name
????????????????????if(item.isFormField()){
????????????????????????String?name?=?item.getFieldName();
????????????????????????String?value?=item.getString("utf-8");
????????????????????????System.out.println(name);
????????????????????????System.out.println(value);
????????????????????????request.setAttribute(name,?value);
????????????????????}
//????????????????????如果是上传的文件,则取出文件名,
????????????????????else{
????????????????????????String?name?=?item.getFieldName();
????????????????????????String?value?=?item.getName();
????????????????????????System.out.println(name);
????????????????????????System.out.println(value);
//????????????????????????得到不要地址的文件名,不同的浏览器传递的参数不同,有的直接传递文件名,而又的把文件地址一起传递过来
//????????????????????????使用substring方法可以统一得到文件名而不得到文件位置
????????????????????????int?start?=?value.lastIndexOf("\");
????????????????????????String?fileName?=?value.substring(start?+?1);
????????????????????????request.setAttribute(name,?fileName);
//????????????????????????写文件到path目录,文件名问filename
????????????????????????item.write(new?File(path,fileName));
????????????????????}
????????????????}
????????????}
????????
????????????catch?(FileUploadException?e)?{
????????????????e.printStackTrace();
????????????}?catch?(Exception?e)?{
????????????????e.printStackTrace();
????????????}
//????????????跳转到显示结果页面
????????????request.getRequestDispatcher("upload/result2.jsp").forward(request,?response);
????}
}用EL表达式显示输出
1
??<body>
?????用户名:${requestScope.username?}?<br>
?????密??码:${requestScope.password?}?<br>
?????文件1?:${requestScope.file1?}<br>
?????文件2?:${requestScope.file2?}<br>
??</body>
其实很简单的设置就可以把中文件上传,并正确显示正确的中文文件名。
在网上找了一点资料,但是都写得很少,没有把完整的写出来。
所以把它写出来,让大家少走点弯路。