首页 > 编程 > Java > 正文

Spring MVC 文件上传下载的实例

2019-11-26 13:17:41
字体:
来源:转载
供稿:网友

Spring MVC 文件上传下载,具体如下:

(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  */ 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;  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/";   /**   * 将上传的文件进行重命名   *   * @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;  }   /**   * 压缩后的文件名   *   * @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";  }   /**   * 上传文件   *   * @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;  }   /**   * 下载   * @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  */ 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;  @Controller @RequestMapping(value = "background/fileOperate") public class FileOperateController {  /**   * 到上传文件的位置   * @return   */  @RequestMapping(value = "to_upload")  public ModelAndView toUpload() {   return new ModelAndView("background/fileOperate/upload");  }   /**   * 上传文件   *   * @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);  }   /**   * 下载   *   * @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下载文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表