Spring MVC 文件上传下载的实例

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

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

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

 

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

 

(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> upload(HttpServletRequest request, 
   String[] params, Map values) throws Exception { 
 
  List> result = new ArrayList>(); 
 
  MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; 
  Map 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> it = fileMap.entrySet() 
    .iterator(); it.hasNext(); i++) { 
 
   Map.Entry 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 map = new HashMap(); 
   // 固定参数值对 
   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 map = new HashMap(); 
 
  // 别名 
  String[] alaises = ServletRequestUtils.getStringParameters(request, 
    "alais"); 
 
  String[] params = new String[] { "alais" }; 
  Map values = new HashMap(); 
  values.put("alais", alaises); 
 
  List> 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"%> 
 
 
 
 
Insert title here 
 
 
 
" method="post">


 确保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"%> 
 
 
 
 
Insert title here 
 
 
  
   
    
    ${m.value } 
    
   

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

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

你可能感兴趣的:(Spring MVC 文件上传下载的实例)