• 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下载文件

  • 相关阅读:
    mongoDB BI 分析利器
    如何定位 Node.js 的内存泄漏
    如何对MySQL数据库中的数据进行实时同步
    [有奖活动进行中]阿里数据库专家曾文旌为你解决数据库那些事
    如何实现Docker应用的自定义弹性伸缩
    vue methods 中方法的相互调用
    vue 实现部分路由组件缓存
    SSH框架之一详解maven搭建多模块项目
    GitHub Pages 搭建流程-基于jekyll-bootstrap
    ExtJs 4 中的MVC应用架构
  • 原文地址:https://www.cnblogs.com/plf112233/p/3637905.html
Copyright © 2020-2023  润新知