您的位置:首页 > 编程语言 > Java开发

Struts上传文件乱码另类解决方案

2015-03-12 16:55 393 查看
Struts学习的不是太好,最近项目上遇到一个棘手问题,我这边要做一个接收post的上传文件的请求,对方是gbk编码的,而我们项目中是utf-8的编码格式,那问题来了,这样接收到的文件名肯定是乱码。

网上搜了很多方法,比如在Struts-config.xml中配置<constant name="struts.i18n.encoding" value="gbk"/>,这个是可以的,但是这个是设置Struts的默认编码,这样其他同事编写的上传文件的代码就会受到影响。还有其他的什么的,都试过要不就是解决不了,要不就是影响别人的代码。

先看看为什么会乱码,post请求过来后先会先进过Struts的默认过滤器,这个里面会对request进行封装,而这里使用的编码格式就是上面提到的配置<constant name="struts.i18n.encoding" value="gbk"/> 具体分析这个人的分析http://blog.csdn.net/techbirds_bao/article/details/8233156。

所以要解决乱码就必须在Struts对request进行封装之前处理才行。

我的解决方案

1、先配置一个过滤器UploadFilter,注意一定要定义在Struts2过滤器之前,不然等于没写,Struts2的过滤器执行完了就完成对request的封装。

<span style="white-space:pre">	</span><filter>
<filter-name>uploadFilter</filter-name>
<filter-class>
com.centit.filter.UploadFilter
</filter-class>
</filter>
<span style="white-space:pre">	</span><filter-mapping>
<filter-name>uploadFilter</filter-name>
<url-pattern>/dispatchdoc/incomeDoc!post.do</url-pattern>
<span style="white-space:pre">	</span></filter-mapping>
2、创建UploadFilter类,在doFilter()方法中获取request,并对request进行解析,上传文件,

使用servlet上传文件的方法,参考http://blog.163.com/sostrong@yeah/blog/static/740174062009720025624/

package com.centit.filter;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub

}

@Override
public void destroy() {
// TODO Auto-generated method stub

}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
response.setContentType("text/html;charset=gbk");
request.setCharacterEncoding("gbk");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items;
try {
items = upload.parseRequest(request);
// 上传文件解析
String savePath = request.getRealPath("/page/temp/recyle");
//上传之前先清空文件夹
deleteFile(new File(savePath));
// 枚举方法
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
// 判断是文件还是文本信息
if (item.isFormField()) {
System.out.println("表单参数名:" + item.getFieldName()
+ ",表单参数值:" + item.getString("gbk"));
} else {
if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件
// System.out.println("上传文件的大小:" + item.getSize());
// System.out.println("上传文件的类型:" + item.getContentType());
// item.getName()返回上传文件在客户端的完整路径名称
// System.out.println("上传文件的名称:" + item.getName());
// 此时文件暂存在服务器的内存当中
File tempFile = new File(item.getName());// 构造临时对象
File file = new File(savePath, tempFile.getName());
// 获取根目录对应的真实物理路径
item.write(file);// 保存文件在服务器的物理磁盘中
request.setAttribute("upload.message", "上传文件成功!");// 返回上传结果
} else {
request.setAttribute("upload.message", "没有选择上传文件!");
}
}
}
chain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("upload.message", "上传文件失败!");
}
}

public static void deleteFile(File oldPath) {
if (oldPath.isDirectory()) {
System.out.println(oldPath + "是文件夹--");
File[] files = oldPath.listFiles();
for (File file : files) {
deleteFile(file);
}
} else {
oldPath.delete();
}
}
}


在这里可以随意设置编码格式,随便对方是什么格式的编码,我在这里修改一下,就行了,而且不影响其他同事的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: