common fileUpload 接收文件以外的参数和中文乱码的问题

本文介绍使用Commons FileUpload处理文件上传时遇到的中文乱码问题及解决方案,同时提供了处理非文件参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 关于common fileUpload 接收非文件的参数和中文乱码的问题

最近的项目中要用到common fileUpload 在接收参数时出现了中文乱码,在这里我记录一下,以供后来的人可以少走这个弯路。由于在网上找到的文章好多都是转载的,所以解决这个问题也用了我一个上午的时间。

这里贴出一部分的代码

代码中的一些变量没有定义的是在try{}catch(){}以外定义的。代码中有些不严谨的地方,我并没有修改

  1.     try{
  2.             String regExp = ".+////(.+)$"// 正则匹配,去掉路径取文件名.
  3.             String errortype[] = { ".exe"".com"".cgi"".asp" };
  4.             Pattern p = Pattern.compile(regExp);
  5.             String uploadPath = "D:/image";   //这里我用的是绝对路径,这里可以在web.xml中配置,如果一定要用绝对路径的 话
  6.             boolean isMultipart = FileUploadBase.isMultipartContent(request);
  7.             DiskFileItemFactory factory = new DiskFileItemFactory();
  8.             factory.setSizeThreshold(1024);
  9.             ServletFileUpload upload = new ServletFileUpload(factory);
  10.             upload.setSizeMax(1024 * 1024);
  11.             upload.setHeaderEncoding("gb2312");   //这里要设置一下,设置成你需要的格式
  12.             List<FileItem> fileItem = upload.parseRequest(request);
  13.             Iterator<FileItem> it = fileItem.iterator();
  14.             
  15.             while (it.hasNext()) {
  16.                 FileItem fi = it.next();
  17.                 String oriFileName = fi.getName();
  18.                 if (fi.isFormField()) {      //在这里判断一下,是否要接收非文件的参数,这里接收的非文件的参数
  19.                     String formName = fi.getFieldName();
  20.                     String formContent = fi.getString();
  21.                     formName = new String(formName.getBytes(), "gb2312");       //这一句似乎不用也行,没测试
  22.                     formContent = new String(formContent.getBytes(), "gb2312");//这一句也没有测试,好象不用也行
  23.                     if (formName.equalsIgnoreCase("categoryId")) {
  24.                         categoryId = Integer.parseInt(formContent);
  25.                     } else if (formName.equalsIgnoreCase("goodsName")) {
  26.                         goodsName = formContent;
  27.                     } else if (formName.equalsIgnoreCase("price")) {
  28.                         price = Float.parseFloat(formContent);
  29.                     } else if (formName.equalsIgnoreCase("salePrice")) {
  30.                         salePrice = Float.parseFloat(formContent);
  31.                     } else if (formName.equalsIgnoreCase("description")) {
  32.                         description = formContent;
  33.                     } else if (formName.equalsIgnoreCase("isExist")) {
  34.                         isExist = Integer.parseInt(formContent);
  35.                     }
  36.                 }
  37.                 else{                                                               //这里接收的是文件的参数。
  38.                     if (!fi.isFormField() && (oriFileName != null)) {
  39.                         Matcher m = p.matcher(oriFileName);
  40.                         boolean result = m.find();
  41.                         if (result) {
  42.                             for (int i = 0; i < errortype.length; i++) {
  43.                                 if (m.group(1).endsWith(errortype[i])) {
  44.                                     throw new IOException(oriFileName
  45.                                             + " wrong type");
  46.                                 }
  47.                             }
  48.                             try {
  49.                                 fi.write(new File(uploadPath + "/"
  50.                                                 + m.group(1)));
  51.                                 path = uploadPath + "/" + m.group(1);   //这个path是我在try{}catch(){}以外定义的,以便得到这个值存入数据库
  52.                                 System.out.println("上传成功");
  53.                             } catch (Exception es) {
  54.                                 es.printStackTrace();
  55.                             }
  56.                         }
  57.                     }
  58.                 }
  59.             }
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         }

 上面的方法可以接收正确的中文,也可以接收非文件域的参数

  如果是大量的用到文件上传的话也可以把这个功能单独写到一个类里,以便调用。下面我贴出一个别人写好的类。

  如果要用,这个可以做个参考,直接拿来用不是个好的学习习惯。

  1. package com.flc.util;
  2. import java.util.*;
  3. import java.io.*;
  4. import javax.servlet.http.*;
  5. import org.apache.commons.fileupload.*;
  6. /**
  7.  * * Jakarta commans FileUpload 封装类. 提供: 参数读取(在 Tomcat 4 下测试过似乎没有中文问题), 文件保存功能. *
  8.  * 示例代码(在 JSP 页面中, 忽略了异常处理代码): test.htm Input name: Select a file: test.jsp
  9.  * JakartaFileUploadHandler uploadHandler = new
  10.  * JakartaFileUploadHandler(request); // 如果是文件上传表单
  11.  * if(uploadHandler.isMultipart()) // 读取参数 { String parameterValue =
  12.  * uploadHandler.getParameter("username"); // 保存文件
  13.  * JakartaFileUploadHandler.saveFileItem(uploadHandler.getFileItem("file1"), new
  14.  * File("file1.txt")); } 更多参考资料请看 Apache 的网站上的指导文章: Using FileUpload
  15.  * 
  16.  * @link http://jakarta.apache.org/commons/fileupload/using.html *
  17.  * @see #getParameter(String) *
  18.  * @see #getParameterValues(String) *
  19.  * @see #saveFileItem(FileItem, File) * * 这个类依赖于 Jakarta
  20.  *      commons-fileupload-1.0.p. * *
  21.  * @author 刘长炯 *
  22.  * @version 1.0 * 2005-03-23
  23.  */
  24. public class JakartaFileUploadHandler {
  25.     /** 文件域列表 */
  26.     private Map fileFields = new TreeMap();
  27.     /** 表单域列表 */
  28.     private Map formFields = new TreeMap();
  29.     /** Check that we have a file upload request */
  30.     private boolean isMultipart = false;
  31.     private HttpServletRequest request = null;
  32.     /** * 空构造器. */
  33.     public JakartaFileUploadHandler() {
  34.     }
  35.     /** * 根据现有参数构造一个上传处理器. */
  36.     public JakartaFileUploadHandler(HttpServletRequest request) {
  37.         setRequest(request);
  38.     }
  39.     /**
  40.      * * 设置 HttpServletRequest 并分析里面的表单数据. *
  41.      * 
  42.      * @param request -
  43.      *            HttpServletRequest
  44.      */
  45.     public void setRequest(HttpServletRequest request) {
  46.         this.request = request;
  47.         isMultipart = FileUpload.isMultipartContent(request); // 如果是文件上传请求,
  48.         // 就提取里面的参数
  49.         if (isMultipart) {
  50.             // Create a new file upload handler
  51.             DiskFileUpload upload = new DiskFileUpload();
  52.             try {
  53.                 // Parse the request
  54.                 List /* FileItem */items = upload.parseRequest(request);
  55.                 // Process the uploaded items
  56.                 Iterator iter = items.iterator();
  57.                 while (iter.hasNext()) {
  58.                     FileItem item = (FileItem) iter.next();
  59.                     String name = item.getFieldName();
  60.                     String value = item.getString();
  61.                     if (item.isFormField()) {
  62.                         processFormField(item);
  63.                     } else {
  64.                         processUploadedFile(item);
  65.                     }
  66.                 }
  67.             } catch (Exception ex) {
  68.                 System.err.println("无法处理上传数据:" + ex);
  69.             }
  70.         }
  71.     }
  72.     /**
  73.      * * 处理表单项目. *
  74.      * 
  75.      * @param item -
  76.      *            FileItem 对象
  77.      * 
  78.      */
  79.     private void processFormField(FileItem item) {
  80.         String name = item.getFieldName();
  81.         String value = item.getString(); // 首先尝试获取原来的值
  82.         Object oldValue = formFields.get(name);
  83.         if (oldValue == null) {
  84.             formFields.put(name, value);
  85.         } else {
  86.             // 多个值存储为 List // 原来为单个值则添加现有的值
  87.             try {
  88.                 String oldString = (String) oldValue;
  89.                 List list = new ArrayList();
  90.                 list.add(oldString);
  91.                 list.add(value);
  92.                 formFields.put(name, list);
  93.             } catch (Exception ex) {
  94.                  ex.printStackTrace();
  95.             } 
  96.             // 原来为多个值则添加现有的值
  97.             try {
  98.                 List list = (List) oldValue;
  99.                 list.add(value);
  100.                 formFields.put(name, list);
  101.             } catch (Exception ex) {//  
  102.                 ex.printStackTrace();
  103.             }
  104.         }
  105.     }
  106.     /**
  107.      * * 处理文件项目.
  108.      * 
  109.      * @param item
  110.      *            -FileItem 对象
  111.      * 
  112.      */
  113.     private void processUploadedFile(FileItem item) {
  114.         String name = item.getFieldName();
  115.         fileFields.put(name, item);
  116.     }
  117. }

 

            这个类是我在网上搜集到的。没有测试。

 

 

                         

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值