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

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/Struggles/p/4381554.html
Copyright © 2020-2023  润新知