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的封装。
使用servlet上传文件的方法,参考http://blog.163.com/sostrong@yeah/blog/static/740174062009720025624/
在这里可以随意设置编码格式,随便对方是什么格式的编码,我在这里修改一下,就行了,而且不影响其他同事的方法
网上搜了很多方法,比如在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(); } } }
在这里可以随意设置编码格式,随便对方是什么格式的编码,我在这里修改一下,就行了,而且不影响其他同事的方法
相关文章推荐
- struts1.0文件上传获取文本域值乱码解决方案
- wordpress文件上传部分中文字符乱码解决方案
- commons fileupload 文件上传乱码问题解决方案 + request.getParameter无法得到参数问题
- SSH框架Struts文件上传自定义错误提示信息解决方案
- 上传中文文件到linux文件出现乱码问题的解决方案
- JSP SmartUpload上传文件乱码解决纪实+UploadBean上传解决方案
- struts资源文件的配置及程序调试的方法-视频(包含所有中文乱码的解决方案)
- ASP上传文件或图片后出现乱码(解决方案)
- MultipartEntity上传文件时传递中文参数出现乱码的解决方案
- commons fileupload 文件上传乱码问题解决方案 + request.getParameter无法得到参数问题
- Struts2文件上传与下载中的中文乱码问题解决方案
- Struts实现文件下载中文乱码解决方案
- Ext+struts+java 文件上传 后台乱码解决!
- struts文件上传以及中文乱码问题
- 关于struts文件上传遇到只有文件值没有接收到以及文件消失的解决方案
- JSP SmartUpload上传文件乱码解决纪实+UploadBean上传解决方案
- struts 上传文件乱码问题解决方法
- Struts实现文件下载中文乱码解决方案
- JSP SmartUpload上传文件乱码解决纪实+UploadBean上传解决方案
- php文件上传后台存储中文乱码问题解决方案