• SpringMVC的上传和下载


    转自:http://blog.csdn.net/geloin/article/details/7537425

    相关资源下载地址:http://download.csdn.net/detail/geloin/4506561

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

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

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

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

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

    1. <beans default-lazy-init="true"
    2.     xmlns="http://www.springframework.org/schema/beans"
    3.     xmlns:p="http://www.springframework.org/schema/p"
    4.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5.     xmlns:context="http://www.springframework.org/schema/context"
    6.     xmlns:mvc="http://www.springframework.org/schema/mvc"
    7.     xsi:schemaLocation="
    8.        http://www.springframework.org/schema/beans
    9.        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    10.        http://www.springframework.org/schema/mvc
    11.        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    12.        http://www.springframework.org/schema/context
    13.        http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    (3) 添加工具类FileOperateUtil.java

    点击(此处)折叠或打开

    1. /**
    2.  *
    3.  * @author geloin
    4.  * @date 2012-5-5 下午12:05:57
    5.  */
    6. package com.geloin.spring.util;

    7. import java.io.BufferedInputStream;
    8. import java.io.BufferedOutputStream;
    9. import java.io.File;
    10. import java.io.FileInputStream;
    11. import java.io.FileOutputStream;
    12. import java.text.SimpleDateFormat;
    13. import java.util.ArrayList;
    14. import java.util.Date;
    15. import java.util.HashMap;
    16. import java.util.Iterator;
    17. import java.util.List;
    18. import java.util.Map;

    19. import javax.servlet.http.HttpServletRequest;
    20. import javax.servlet.http.HttpServletResponse;

    21. import org.apache.tools.zip.ZipEntry;
    22. import org.apache.tools.zip.ZipOutputStream;
    23. import org.springframework.util.FileCopyUtils;
    24. import org.springframework.web.multipart.MultipartFile;
    25. import org.springframework.web.multipart.MultipartHttpServletRequest;

    26. /**
    27.  *
    28.  * @author geloin
    29.  * @date 2012-5-5 下午12:05:57
    30.  */
    31. public class FileOperateUtil {
    32.     private static final String REALNAME = "realName";
    33.     private static final String STORENAME = "storeName";
    34.     private static final String SIZE = "size";
    35.     private static final String SUFFIX = "suffix";
    36.     private static final String CONTENTTYPE = "contentType";
    37.     private static final String CREATETIME = "createTime";
    38.     private static final String UPLOADDIR = "uploadDir/";

    39.     /**
    40.      * 将上传的文件进行重命名
    41.      *
    42.      * @author geloin
    43.      * @date 2012-3-29 下午3:39:53
    44.      * @param name
    45.      * @return
    46.      */
    47.     private static String rename(String name) {

    48.         Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss")
    49.                 .format(new Date()));
    50.         Long random = (long) (Math.random() * now);
    51.         String fileName = now + "" + random;

    52.         if (name.indexOf(".") != -1) {
    53.             fileName += name.substring(name.lastIndexOf("."));
    54.         }

    55.         return fileName;
    56.     }

    57.     /**
    58.      * 压缩后的文件名
    59.      *
    60.      * @author geloin
    61.      * @date 2012-3-29 下午6:21:32
    62.      * @param name
    63.      * @return
    64.      */
    65.     private static String zipName(String name) {
    66.         String prefix = "";
    67.         if (name.indexOf(".") != -1) {
    68.             prefix = name.substring(0, name.lastIndexOf("."));
    69.         } else {
    70.             prefix = name;
    71.         }
    72.         return prefix + ".zip";
    73.     }

    74.     /**
    75.      * 上传文件
    76.      *
    77.      * @author geloin
    78.      * @date 2012-5-5 下午12:25:47
    79.      * @param request
    80.      * @param params
    81.      * @param values
    82.      * @return
    83.      * @throws Exception
    84.      */
    85.     public static List<Map<String, Object>> upload(HttpServletRequest request,
    86.             String[] params, Map<String, Object[]> values) throws Exception {

    87.         List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    88.         MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
    89.         Map<String, MultipartFile> fileMap = mRequest.getFileMap();

    90.         String uploadDir = request.getSession().getServletContext()
    91.                 .getRealPath("/")
    92.                 + FileOperateUtil.UPLOADDIR;
    93.         File file = new File(uploadDir);

    94.         if (!file.exists()) {
    95.             file.mkdir();
    96.         }

    97.         String fileName = null;
    98.         int i = 0;
    99.         for (Iterator<Map.Entry<String, MultipartFile>> it = fileMap.entrySet()
    100.                 .iterator(); it.hasNext(); i++) {

    101.             Map.Entry<String, MultipartFile> entry = it.next();
    102.             MultipartFile mFile = entry.getValue();

    103.             fileName = mFile.getOriginalFilename();

    104.             String storeName = rename(fileName);

    105.             String noZipName = uploadDir + storeName;
    106.             String zipName = zipName(noZipName);

    107.             // 上传成为压缩文件
    108.             ZipOutputStream outputStream = new ZipOutputStream(
    109.                     new BufferedOutputStream(new FileOutputStream(zipName)));
    110.             outputStream.putNextEntry(new ZipEntry(fileName));
    111.             outputStream.setEncoding("GBK");

    112.             FileCopyUtils.copy(mFile.getInputStream(), outputStream);

    113.             Map<String, Object> map = new HashMap<String, Object>();
    114.             // 固定参数值对
    115.             map.put(FileOperateUtil.REALNAME, zipName(fileName));
    116.             map.put(FileOperateUtil.STORENAME, zipName(storeName));
    117.             map.put(FileOperateUtil.SIZE, new File(zipName).length());
    118.             map.put(FileOperateUtil.SUFFIX, "zip");
    119.             map.put(FileOperateUtil.CONTENTTYPE, "application/octet-stream");
    120.             map.put(FileOperateUtil.CREATETIME, new Date());

    121.             // 自定义参数值对
    122.             for (String param : params) {
    123.                 map.put(param, values.get(param)[i]);
    124.             }

    125.             result.add(map);
    126.         }
    127.         return result;
    128.     }

    129.     /**
    130.      * 下载
    131.      *
    132.      * @author geloin
    133.      * @date 2012-5-5 下午12:25:39
    134.      * @param request
    135.      * @param response
    136.      * @param storeName
    137.      * @param contentType
    138.      * @param realName
    139.      * @throws Exception
    140.      */
    141.     public static void download(HttpServletRequest request,
    142.             HttpServletResponse response, String storeName, String contentType,
    143.             String realName) throws Exception {
    144.         response.setContentType("text/html;charset=UTF-8");
    145.         request.setCharacterEncoding("UTF-8");
    146.         BufferedInputStream bis = null;
    147.         BufferedOutputStream bos = null;

    148.         String ctxPath = request.getSession().getServletContext()
    149.                 .getRealPath("/")
    150.                 + FileOperateUtil.UPLOADDIR;
    151.         String downLoadPath = ctxPath + storeName;

    152.         long fileLength = new File(downLoadPath).length();

    153.         response.setContentType(contentType);
    154.         response.setHeader("Content-disposition", "attachment; filename="
    155.                 + new String(realName.getBytes("utf-8"), "ISO8859-1"));
    156.         response.setHeader("Content-Length", String.valueOf(fileLength));

    157.         bis = new BufferedInputStream(new FileInputStream(downLoadPath));
    158.         bos = new BufferedOutputStream(response.getOutputStream());
    159.         byte[] buff = new byte[2048];
    160.         int bytesRead;
    161.         while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    162.             bos.write(buff, 0, bytesRead);
    163.         }
    164.         bis.close();
    165.         bos.close();
    166.     }
    167. }


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

            (4) 添加FileOperateController.java

    1. /**
    2.  *
    3.  * @author geloin
    4.  * @date 2012-5-5 上午11:56:35
    5.  */
    6. package com.geloin.spring.controller;

    7. import java.util.HashMap;
    8. import java.util.List;
    9. import java.util.Map;

    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;

    12. import org.springframework.stereotype.Controller;
    13. import org.springframework.web.bind.ServletRequestUtils;
    14. import org.springframework.web.bind.annotation.RequestMapping;
    15. import org.springframework.web.servlet.ModelAndView;

    16. import com.geloin.spring.util.FileOperateUtil;

    17. /**
    18.  *
    19.  * @author geloin
    20.  * @date 2012-5-5 上午11:56:35
    21.  */
    22. @Controller
    23. @RequestMapping(value = "background/fileOperate")
    24. public class FileOperateController {
    25.     /**
    26.      * 到上传文件的位置
    27.      *
    28.      * @author geloin
    29.      * @date 2012-3-29 下午4:01:31
    30.      * @return
    31.      */
    32.     @RequestMapping(value = "to_upload")
    33.     public ModelAndView toUpload() {
    34.         return new ModelAndView("background/fileOperate/upload");
    35.     }

    36.     /**
    37.      * 上传文件
    38.      *
    39.      * @author geloin
    40.      * @date 2012-3-29 下午4:01:41
    41.      * @param request
    42.      * @return
    43.      * @throws Exception
    44.      */
    45.     @RequestMapping(value = "upload")
    46.     public ModelAndView upload(HttpServletRequest request) throws Exception {

    47.         Map<String, Object> map = new HashMap<String, Object>();

    48.         // 别名
    49.         String[] alaises = ServletRequestUtils.getStringParameters(request,
    50.                 "alais");

    51.         String[] params = new String[] { "alais" };
    52.         Map<String, Object[]> values = new HashMap<String, Object[]>();
    53.         values.put("alais", alaises);

    54.         List<Map<String, Object>> result = FileOperateUtil.upload(request,
    55.                 params, values);

    56.         map.put("result", result);

    57.         return new ModelAndView("background/fileOperate/list", map);
    58.     }

    59.     /**
    60.      * 下载
    61.      *
    62.      * @author geloin
    63.      * @date 2012-3-29 下午5:24:14
    64.      * @param attachment
    65.      * @param request
    66.      * @param response
    67.      * @return
    68.      * @throws Exception
    69.      */
    70.     @RequestMapping(value = "download")
    71.     public ModelAndView download(HttpServletRequest request,
    72.             HttpServletResponse response) throws Exception {

    73.         String storeName = "201205051340364510870879724.zip";
    74.         String realName = "Java设计模式.zip";
    75.         String contentType = "application/octet-stream";

    76.         FileOperateUtil.download(request, response, storeName, contentType,
    77.                 realName);

    78.         return null;
    79.     }
    80. }


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


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


    确保enctype的值为multipart/form-data;method的值为post。        
    (6) 添加fileOperate/list.jsp

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.     pageEncoding="UTF-8"%>
    3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    4. <!DOCTYPE html
    5. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    6. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    7. <html>
    8. <head>
    9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    10. <title>Insert title here</title>
    11. </head>
    12. <body>
    13.     <c:forEach items="${result }" var="item">
    14.         <c:forEach items="${item }" var="m">
    15.             <c:if test="${m.key eq 'realName' }">
    16.                 ${m.value }
    17.             </c:if>
    18.             <br />
    19.         </c:forEach>
    20.     </c:forEach>
    21. </body>
    22. </html>


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

  • 相关阅读:
    poj 1088 滑雪
    位运算与bitset
    hdu 4607 Park Visit
    树的直径
    codeforces 495D Sonya and Matrix
    German Collegiate Programming Contest 2015(第三场)
    BAPC 2014 Preliminary(第一场)
    Benelux Algorithm Programming Contest 2014 Final(第二场)
    E. Reachability from the Capital(tarjan+dfs)
    poj2104 K-th Number(划分树)
  • 原文地址:https://www.cnblogs.com/Struggles/p/4381554.html
Copyright © 2020-2023  润新知