java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取

来源:互联网 发布:软件设计师有什么用 编辑:程序博客网 时间:2024/05/16 10:04
//该类需要一个httpServletRequest作为参数.
//前面要导入fileupload和io包,都是apache的
public class FileUpload {
    public void upLoad(HttpServletRequest request) throws ServletException,
            IOException {
         String uploadPath = "d://test//"; // 用于存放上传文件的目录,建议要先建好文件夹

         String tempPath = "d://testTemp//"; // 用于存放临时文件的目录,建议要先建好文件夹
           
        // 检查是否是个file的request请求.再form中enctype="multipart/form-data"来约束
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (!isMultipart) {
            throw new RuntimeException();
        }
        // Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // set temperoy memory size 4M
        factory.setSizeThreshold(1024 * 1024 * 4);
        // Sets the directory used to temporarily
        factory.setRepository(new File(tempPath));
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        // set the sigle file max 5G
        //upload.setFileSizeMax(1024 * 1024 * 1024);
        // set the request max size hG
        upload.setSizeMax(1024 * 1024 * 1024);
        // Parse the request
       
        try {
            List items = upload.parseRequest(request);
            Iterator iter = items.iterator();
            while (iter.hasNext()) {
//读取item
                FileItem item = (FileItem) iter.next();
//得到表单中域的name 从上倒下.从左到右.页面
                String   fieldName   =   item.getFieldName();
//先判断该域是否为文件域,如果是返回false,再判断是否是没用的域.这里排除了submit这个域.不过这样把代码写死了.应该还有好的方法.大家一起来改进
                 if(item.isFormField()&&(!fieldName.equals("submit"))){
                     
                  //打印域名
                     System.out.println(fieldName);
               
                     String value= item.getString();
            //页面传的值都是iso-8859-1的.这里转一下下  
                 value = new String(value.getBytes("ISO-8859-1"),"GB2312");
       //打印域的value
                     System.out.println(value);
                 
                 }
    //else 这下都是文件域.就可以设置并保存了. 得到文件名称
                String fileName = item.getName();

          //判断该文件名称是否为空 ,防止多文件上传时候有空.
                if (fileName != null) {
                    System.out.println(item.getFieldName());
                    fileName = fileName.substring(
                            fileName.lastIndexOf("//") + 1, fileName.length());
              
                    System.out.println(fileName);
                    item.write(new File(uploadPath + fileName));
                    System.out.println(fileName);
                }
            }
        } catch (Exception e) {
        }
    }

下面是过滤器 我就不多说了
package web;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter{
    private FilterConfig config;

    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    public FilterConfig getConfig() {
        return config;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //System.out.println("filter has been called");
        String characterEncoding = config.getInitParameter("characterEncoding");
        if(characterEncoding==null)characterEncoding = "GB2312";
        request.setCharacterEncoding(characterEncoding);
        response.setCharacterEncoding(characterEncoding);
        chain.doFilter(request, response);
    }
   
    public void destroy() {
    }
}


页面

<form onSubmit="return validate()" name="userForm" method="post"
            action="file" enctype="multipart/form-data">
            <input name="file" type="file" class="style4" value="" size="20">
            <input name="file" type="file" class="style4" value="" size="20">
            <input name="file" type="file" class="style4" value="" size="20">
            <input name="file" type="file" class="style4" value="" size="20">
            <input name="file" type="file" class="style4" value="" size="20">
            <input name="name" type="text" >
            <input name="key" type="text" >
            <input name="pasword" type="text" >
            <input name="des" type="text" >
            <input name="tt" type="text" >
           
            <input type="submit" value="上传" name="submit" class="s02">
        </form>

web.xml

<filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>web.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

余下导包和调用.就不说了.这里提2点不足.
1 没有实现进度条.一牵扯到ajax我就脑袋大
2 tomcat终端总是报
984 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803390984 sessioncount 0
15:36:30,984 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:37:31,265 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803451265 sessioncount 0
15:37:31,265 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:38:31,546 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803511546 sessioncount 0
15:38:31,546 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
15:39:31,859 DEBUG ManagerBase:676 - Start expire sessions StandardManager at 1195803571859 sessioncount 0
15:39:31,859 DEBUG ManagerBase:685 - End expire sessions StandardManager processingTime 0 expired sessions: 0
不停的报.不知道谁知道答案可以告诉我.我的QQ14617107

 
原创粉丝点击