Spring MVC 文件上传下载

本文基于Spring MVC 注解,让Spring跑起来

        (1) 导入jar包:ant.jar、commons-fileupload.jar、connom-io.jar。

        (2) 在src/context/dispatcher.xml中添加

    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
        p:defaultEncoding="UTF-8" />  

注意,需要在头部添加内容,添加后如下所示:

    <beans default-lazy-init="true"  
        xmlns="http://www.springframework.org/schema/beans"  
        xmlns:p="http://www.springframework.org/schema/p"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:mvc="http://www.springframework.org/schema/mvc"  
        xsi:schemaLocation="    
           http://www.springframework.org/schema/beans     
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
           http://www.springframework.org/schema/mvc     
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd     
           http://www.springframework.org/schema/context    
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">  

(3) 添加工具类FileOperateUtil.java

    /** 
     * 
     * @author geloin 
     * @date 2012-5-5 下午12:05:57 
     */  
    package com.geloin.spring.util;  
      
    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.text.SimpleDateFormat;  
    import java.util.ArrayList;  
    import java.util.Date;  
    import java.util.HashMap;  
    import java.util.Iterator;  
    import java.util.List;  
    import java.util.Map;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import org.apache.tools.zip.ZipEntry;  
    import org.apache.tools.zip.ZipOutputStream;  
    import org.springframework.util.FileCopyUtils;  
    import org.springframework.web.multipart.MultipartFile;  
    import org.springframework.web.multipart.MultipartHttpServletRequest;  
      
    /** 
     *  
     * @author geloin 
     * @date 2012-5-5 下午12:05:57 
     */  
    public class FileOperateUtil {  
        private static final String REALNAME = "realName";  
        private static final String STORENAME = "storeName";  
        private static final String SIZE = "size";  
        private static final String SUFFIX = "suffix";  
        private static final String CONTENTTYPE = "contentType";  
        private static final String CREATETIME = "createTime";  
        private static final String UPLOADDIR = "uploadDir/";  
      
        /** 
         * 将上传的文件进行重命名 
         *  
         * @author geloin 
         * @date 2012-3-29 下午3:39:53 
         * @param name 
         * @return 
         */  
        private static String rename(String name) {  
      
            Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss")  
                    .format(new Date()));  
            Long random = (long) (Math.random() * now);  
            String fileName = now + "" + random;  
      
            if (name.indexOf(".") != -1) {  
                fileName += name.substring(name.lastIndexOf("."));  
            }  
      
            return fileName;  
        }  
      
        /** 
         * 压缩后的文件名 
         *  
         * @author geloin 
         * @date 2012-3-29 下午6:21:32 
         * @param name 
         * @return 
         */  
        private static String zipName(String name) {  
            String prefix = "";  
            if (name.indexOf(".") != -1) {  
                prefix = name.substring(0, name.lastIndexOf("."));  
            } else {  
                prefix = name;  
            }  
            return prefix + ".zip";  
        }  
      
        /** 
         * 上传文件 
         *  
         * @author geloin 
         * @date 2012-5-5 下午12:25:47 
         * @param request 
         * @param params 
         * @param values 
         * @return 
         * @throws Exception 
         */  
        public static List<Map<String, Object>> upload(HttpServletRequest request,  
                String[] params, Map<String, Object[]> values) throws Exception {  
      
            List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();  
      
            MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;  
            Map<String, MultipartFile> fileMap = mRequest.getFileMap();  
      
            String uploadDir = request.getSession().getServletContext()  
                    .getRealPath("/")  
                    + FileOperateUtil.UPLOADDIR;  
            File file = new File(uploadDir);  
      
            if (!file.exists()) {  
                file.mkdir();  
            }  
      
            String fileName = null;  
            int i = 0;  
            for (Iterator<Map.Entry<String, MultipartFile>> it = fileMap.entrySet()  
                    .iterator(); it.hasNext(); i++) {  
      
                Map.Entry<String, MultipartFile> entry = it.next();  
                MultipartFile mFile = entry.getValue();  
      
                fileName = mFile.getOriginalFilename();  
      
                String storeName = rename(fileName);  
      
                String noZipName = uploadDir + storeName;  
                String zipName = zipName(noZipName);  
      
                // 上传成为压缩文件  
                ZipOutputStream outputStream = new ZipOutputStream(  
                        new BufferedOutputStream(new FileOutputStream(zipName)));  
                outputStream.putNextEntry(new ZipEntry(fileName));  
                outputStream.setEncoding("GBK");  
      
                FileCopyUtils.copy(mFile.getInputStream(), outputStream);  
      
                Map<String, Object> map = new HashMap<String, Object>();  
                // 固定参数值对  
                map.put(FileOperateUtil.REALNAME, zipName(fileName));  
                map.put(FileOperateUtil.STORENAME, zipName(storeName));  
                map.put(FileOperateUtil.SIZE, new File(zipName).length());  
                map.put(FileOperateUtil.SUFFIX, "zip");  
                map.put(FileOperateUtil.CONTENTTYPE, "application/octet-stream");  
                map.put(FileOperateUtil.CREATETIME, new Date());  
      
                // 自定义参数值对  
                for (String param : params) {  
                    map.put(param, values.get(param)[i]);  
                }  
      
                result.add(map);  
            }  
            return result;  
        }  
      
        /** 
         * 下载 
         *  
         * @author geloin 
         * @date 2012-5-5 下午12:25:39 
         * @param request 
         * @param response 
         * @param storeName 
         * @param contentType 
         * @param realName 
         * @throws Exception 
         */  
        public static void download(HttpServletRequest request,  
                HttpServletResponse response, String storeName, String contentType,  
                String realName) throws Exception {  
            response.setContentType("text/html;charset=UTF-8");  
            request.setCharacterEncoding("UTF-8");  
            BufferedInputStream bis = null;  
            BufferedOutputStream bos = null;  
      
            String ctxPath = request.getSession().getServletContext()  
                    .getRealPath("/")  
                    + FileOperateUtil.UPLOADDIR;  
            String downLoadPath = ctxPath + storeName;  
      
            long fileLength = new File(downLoadPath).length();  
      
            response.setContentType(contentType);  
            response.setHeader("Content-disposition", "attachment; filename="  
                    + new String(realName.getBytes("utf-8"), "ISO8859-1"));  
            response.setHeader("Content-Length", String.valueOf(fileLength));  
      
            bis = new BufferedInputStream(new FileInputStream(downLoadPath));  
            bos = new BufferedOutputStream(response.getOutputStream());  
            byte[] buff = new byte[2048];  
            int bytesRead;  
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
                bos.write(buff, 0, bytesRead);  
            }  
            bis.close();  
            bos.close();  
        }  
    }  

可完全使用而不必改变该类,需要注意的是,该类中设定将上传后的文件放置在WebContent/uploadDir下。

        (4) 添加FileOperateController.java

    /** 
     * 
     * @author geloin 
     * @date 2012-5-5 上午11:56:35 
     */  
    package com.geloin.spring.controller;  
      
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import org.springframework.stereotype.Controller;  
    import org.springframework.web.bind.ServletRequestUtils;  
    import org.springframework.web.bind.annotation.RequestMapping;  
    import org.springframework.web.servlet.ModelAndView;  
      
    import com.geloin.spring.util.FileOperateUtil;  
      
    /** 
     *  
     * @author geloin 
     * @date 2012-5-5 上午11:56:35 
     */  
    @Controller  
    @RequestMapping(value = "background/fileOperate")  
    public class FileOperateController {  
        /** 
         * 到上传文件的位置 
         *  
         * @author geloin 
         * @date 2012-3-29 下午4:01:31 
         * @return 
         */  
        @RequestMapping(value = "to_upload")  
        public ModelAndView toUpload() {  
            return new ModelAndView("background/fileOperate/upload");  
        }  
      
        /** 
         * 上传文件 
         *  
         * @author geloin 
         * @date 2012-3-29 下午4:01:41 
         * @param request 
         * @return 
         * @throws Exception 
         */  
        @RequestMapping(value = "upload")  
        public ModelAndView upload(HttpServletRequest request) throws Exception {  
      
            Map<String, Object> map = new HashMap<String, Object>();  
      
            // 别名  
            String[] alaises = ServletRequestUtils.getStringParameters(request,  
                    "alais");  
      
            String[] params = new String[] { "alais" };  
            Map<String, Object[]> values = new HashMap<String, Object[]>();  
            values.put("alais", alaises);  
      
            List<Map<String, Object>> result = FileOperateUtil.upload(request,  
                    params, values);  
      
            map.put("result", result);  
      
            return new ModelAndView("background/fileOperate/list", map);  
        }  
      
        /** 
         * 下载 
         *  
         * @author geloin 
         * @date 2012-3-29 下午5:24:14 
         * @param attachment 
         * @param request 
         * @param response 
         * @return 
         * @throws Exception 
         */  
        @RequestMapping(value = "download")  
        public ModelAndView download(HttpServletRequest request,  
                HttpServletResponse response) throws Exception {  
      
            String storeName = "201205051340364510870879724.zip";  
            String realName = "Java设计模式.zip";  
            String contentType = "application/octet-stream";  
      
            FileOperateUtil.download(request, response, storeName, contentType,  
                    realName);  
      
            return null;  
        }  
    }  

下载方法请自行变更,若使用数据库保存上传文件的信息时,请参考Spring MVC 整合Mybatis实例
        (5) 添加fileOperate/upload.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
    <!DOCTYPE html  
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
    <title>Insert title here</title>  
    </head>  
    <body>  
    </body>  
    <form enctype="multipart/form-data"  
        action="<c:url value="/background/fileOperate/upload.html" />" method="post">  
        <input type="file" name="file1" /> <input type="text" name="alais" /><br />  
        <input type="file" name="file2" /> <input type="text" name="alais" /><br />  
        <input type="file" name="file3" /> <input type="text" name="alais" /><br />  
        <input type="submit" value="上传" />  
    </form>  
    </html>  

确保enctype的值为multipart/form-data;method的值为post。        

(6) 添加fileOperate/list.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
    <!DOCTYPE html  
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
    <title>Insert title here</title>  
    </head>  
    <body>  
        <c:forEach items="${result }" var="item">  
            <c:forEach items="${item }" var="m">  
                <c:if test="${m.key eq 'realName' }">  
                    ${m.value }  
                </c:if>  
                <br />  
            </c:forEach>  
        </c:forEach>  
    </body>  
    </html>  

(7) 通过http://localhost:8080/spring_test/background/fileOperate /to_upload.html访问上传页面,通过http://localhost:8080/spring_test/background /fileOperate/download.html下载文件

posted on 2014-04-01 11:27  java界的奥特曼  阅读(413)  评论(0编辑  收藏  举报