zoukankan      html  css  js  c++  java
  • 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下载文件

  • 相关阅读:
    docer run 、docker attach 与 docker exec的区别
    filebeat-kafka:WARN producer/broker/0 maximum request accumulated, waiting for space
    json 格式要求
    词法分析
    CSS3 鲜为人知的属性-webkit-tap-highlight-color的理解
    DOMContentLoaded与load的区别
    用vue的自定义组件写了一个拖拽 组件,局部的 只能在自定义元素内的
    浮动元素遇到标准流元素 会发生转角遇到爱
    柯里化函数
    转载一篇关于toString和valueOf
  • 原文地址:https://www.cnblogs.com/Struggles/p/4381554.html
Copyright © 2011-2022 走看看