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

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();
        }
    }
}

在这里可以随意设置编码格式,随便对方是什么格式的编码,我在这里修改一下,就行了,而且不影响其他同事的方法

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

wubo_Daniel

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值