文件上传

1. 所需三方工具
    1.1. commons-fileupload-1.2.2.jar 文件上传需要的工具
    1.2. commons-io-2.0.1.jar 文件上传所需要的工具
    1.3. commons-lang-2.5.jar 使用其字符串工具,如:判断某字符串是否是空的
2. 自定义的工具
    2.1. UploadUtils.java
    2.2. 因为本工具需要使用临时目录,所以然在web根目录下建立temp文件夹
package com.jeremy.util; 

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

public class UploadUtils {

    private Map<String, String> textFields = new HashMap<String, String>();    // 普通元素
    private Map<String, FileItem> fileFields = new HashMap<String, FileItem>(); // 文件上传元素
    private String baseFolder; // 项目根目录
    private String customFolder;    // 上传目录的下级目录
    private String uploadFolder; // 上传根目录
    private String tempFoleer; // temp folder
    private String[] allowFileExtName; // 允许上传的文件类型

    /**
     * 处理上传
     * 
     * @param request
     * @param uploadPath 用户选择上传的目录
     */

    public void upload(HttpServletRequest request, String uploadPath) {
        // 初始化 根目录,上传目录,用户自定义的上传子目录,临时目录和允许上传的文件类型
        baseFolder = request.getSession().getServletContext().getRealPath("/");
        customFolder = File.separator + uploadPath;
        uploadFolder = baseFolder + customFolder;
        tempFoleer = request.getSession().getServletContext().getRealPath("/temp");
        allowFileExtName = request.getSession().getServletContext().getInitParameter("allowFileExtName").split(",");

        // Check that we have a file upload request
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);

        try {
            if (isMultipart) {

                // Create a factory for disk-based file items
                DiskFileItemFactory factory = new DiskFileItemFactory();

                // Set factory constraints
                factory.setSizeThreshold(1024 * 1024 * 10); // 表单上传占用最大内存为10M
                factory.setRepository(new File(tempFoleer)); // 临时文件

                // Create a new file upload handler
                ServletFileUpload upload = new ServletFileUpload(factory);

                // Single file size 20M
                upload.setFileSizeMax(1024 * 1024 * 20);

                // Parse the request
                List<FileItem> /* FileItem */items = upload.parseRequest(request);

                for (FileItem fileItem : items) {

                    // 文件名
                    String fileName = fileItem.getName();

                    // 如果是普通表单元素,将元素放进textFields中
                    if (fileItem.isFormField()) {
                        textFields.put(fileItem.getFieldName(), fileItem.getString());

                    } else if (StringUtils.isNotBlank(fileName) && ArrayUtils.contains(allowFileExtName, fileName.substring(fileName.lastIndexOf(".")))) {
                        // 如果有上传元素,且是允许上传的文件,则将FileItem直接放入fileFields中
                        fileFields.put(fileItem.getFieldName(), fileItem);

                    } 
                }

            } else {
                return;
            }
        } catch (FileSizeLimitExceededException e) {
            System.out.println("单个文件超出大小限制");
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    /**
     * 如果在普通元素的Map中找到对应的值就返回当前值
     * 在普通元素的Map中没有找到对应的值,就去上传元素的Map中找
     * @param name
     * @return 如果都没有找到,返回的是空
     */

    public String getParameter(String name) {

        if (getTextParameter(name) != null) {
            return getTextParameter(name);
        } else {
            return getFileParameter(name);
        }
    }

    public Map<String, Object> getParameterMap() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.putAll(textFields);    // 将普通元素Map全部复制到新定义的Map中

        // 便利fileFields的Map
        Iterator<String> keys = fileFields.keySet().iterator();
        while (keys.hasNext()) {
            String key = keys.next();
            // 将上传后返回的路径追加到新定义的Map中
            map.put(key, getFileParameter(key));
        }

        return map;
    }

    /**
     * 获取普通元素
     * @param name
     * @return
     */

    private String getTextParameter(String name) {
        return textFields.get(name);
    }

    /**
     * 获取文件上传后的路径
     * 
     * @param name
     * @return
     */

    private String getFileParameter(String name) {

        FileItem fileItem = fileFields.get(name); // 上传项
        if (fileItem != null) {
            String fileName = fileItem.getName(); // 客户端的文件名
            String fileExtName = fileName.substring(fileName.lastIndexOf("."));    // 文件扩展名
            // 放在服务器上的上传目录中的文件名
            String fileNameAtUploaded = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + UUID.randomUUID() + fileExtName;

            // 写入上传目录
            try {
                fileItem.write(new File(uploadFolder, fileNameAtUploaded));
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 返回文件上传路径
            return customFolder + File.separator + fileNameAtUploaded;
        }
        return null;
    }
}
3. 上传的jsp页面
    3.1. index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="hidden" name="id" value="1"><br/>
用户名:<input type="text" name="name"/><br/>
附件:<input type="file" name="file"/><br/>
附件2<input type="file" name="file2"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
4. 管理上传的Servlet
    4.1. UploadServlet
package com.jeremy.servlet; 

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.jeremy.domain.User;
import com.jeremy.util.UploadUtils;

/**
 * Servlet implementation class UploadServlet
 */

public class UploadServlet extends HttpServlet {

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 上传工具类
        UploadUtils uploadUtils = new UploadUtils();
        uploadUtils.upload(request, "upload");    // 执行上传处理,upload是上传的位置

        User user = new User();

        try {
            BeanUtils.copyProperties(user, uploadUtils.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println(user);
    }

}
5. 建立业务对象
    5.1 User.java
package com.jeremy.domain; 

public class User {

    private Integer id;
    private String name;
    private String file;
    private String file2;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFile() {
        return file;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public String getFile2() {
        return file2;
    }

    public void setFile2(String file2) {
        this.file2 = file2;
    }

    @Override
    public String toString() {
        return "User [id = " + id + ", name = " + name + ", file = " + file + ", file2 = " + file2 + "]";
    }

}




posted @ 2012-04-30 15:07  jungor  阅读(310)  评论(0)    收藏  举报