zoukankan      html  css  js  c++  java
  • SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)

      林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

    本文详细讲解了SpringMVC实例单文件上传、多文件上传、文件列表显示、文件下载。

    本文工程免费下载

    一、新建一个Web工程,导入相关的包

    springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+standard.jar

    整个相关的包如下:

    整个工程目录如下:

    二、配置web.xml和SpringMVC文件

    (1)web.xml

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    3.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
    4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
    5.     id="WebApp_ID" version="3.0">  
    6.     <!-- SpringMVC的前端控制器 -->  
    7.     <servlet>  
    8.         <servlet-name>MyDispatcher</servlet-name>  
    9.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    10.         <!-- 设置自己定义的控制器xml文件 -->  
    11.         <init-param>  
    12.             <param-name>contextConfigLocation</param-name>  
    13.             <param-value>/WEB-INF/springMVC-servlet.xml</param-value>  
    14.         </init-param>  
    15.         <load-on-startup>1</load-on-startup>  
    16.     </servlet>  
    17.     <!-- Spring MVC配置文件结束 -->  
    18.   
    19.     <!-- 拦截设置 -->  
    20.     <servlet-mapping>  
    21.         <servlet-name>MyDispatcher</servlet-name>  
    22.         <!-- 由SpringMVC拦截所有请求 -->  
    23.         <url-pattern>/</url-pattern>  
    24.     </servlet-mapping>  
    25.       
    26. </web-app>  

    (2)springMVC-servlet.xml文件

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <beans xmlns="http://www.springframework.org/schema/beans"  
    2.     xmlns:context="http://www.springframework.org/schema/context"  
    3.     xmlns:util="http://www.springframework.org/schema/util"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    5.      xmlns:mvc="http://www.springframework.org/schema/mvc"    
    6.     xsi:schemaLocation="    
    7.         http://www.springframework.org/schema/util   
    8.         http://www.springframework.org/schema/util/spring-util-3.0.xsd  
    9.         http://www.springframework.org/schema/mvc   
    10.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
    11.         http://www.springframework.org/schema/beans         
    12.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
    13.         http://www.springframework.org/schema/mvc      
    14.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
    15.         http://www.springframework.org/schema/context     
    16.         http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
    17.           
    18.     <!-- 把标记了@Controller注解的类转换为bean -->  
    19.     <context:component-scan base-package="com.mucfc" />  
    20.     <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->  
    21.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
    22.         p:prefix="/WEB-INF/views/" p:suffix=".jsp"/>  
    23.             
    24.     <!-- 上传文件的设置 ,maxUploadSize=-1,表示无穷大。uploadTempDir为上传的临时目录 -->  
    25.    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"    
    26.         p:defaultEncoding="UTF-8"    
    27.         p:maxUploadSize="5400000"    
    28.         p:uploadTempDir="fileUpload/temp"    
    29.      />    
    30.   
    31. </beans>  

    三、单个文件上传

    (1)控制器

     

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @Controller  
    2. @RequestMapping("/file")  
    3. public class FileController {  
    4.   
    5.     @RequestMapping("/toFile")  
    6.     public String toFileUpload() {  
    7.         return "fileUpload";  
    8.     }  
    9.   
    10.     @RequestMapping("/toFile2")  
    11.     public String toFileUpload2() {  
    12.         return "fileUpload2";  
    13.     }  
    14.   
    15.     /** 
    16.      * 方法一上传文件 
    17.      */  
    18.     @RequestMapping("/onefile")  
    19.     public String oneFileUpload(  
    20.             @RequestParam("file") CommonsMultipartFile file,  
    21.             HttpServletRequest request, ModelMap model) {  
    22.   
    23.         // 获得原始文件名  
    24.         String fileName = file.getOriginalFilename();  
    25.         System.out.println("原始文件名:" + fileName);  
    26.   
    27.         // 新文件名  
    28.         String newFileName = UUID.randomUUID() + fileName;  
    29.   
    30.         // 获得项目的路径  
    31.         ServletContext sc = request.getSession().getServletContext();  
    32.         // 上传位置  
    33.         String path = sc.getRealPath("/img") + "/"; // 设定文件保存的目录  
    34.   
    35.         File f = new File(path);  
    36.         if (!f.exists())  
    37.             f.mkdirs();  
    38.         if (!file.isEmpty()) {  
    39.             try {  
    40.                 FileOutputStream fos = new FileOutputStream(path + newFileName);  
    41.                 InputStream in = file.getInputStream();  
    42.                 int b = 0;  
    43.                 while ((b = in.read()) != -1) {  
    44.                     fos.write(b);  
    45.                 }  
    46.                 fos.close();  
    47.                 in.close();  
    48.             } catch (Exception e) {  
    49.                 e.printStackTrace();  
    50.             }  
    51.         }  
    52.   
    53.         System.out.println("上传图片到:" + path + newFileName);  
    54.         // 保存文件地址,用于JSP页面回显  
    55.         model.addAttribute("fileUrl", path + newFileName);  
    56.         return "fileUpload";  
    57.     }  
    58.   
    59.     /** 
    60.      * 方法二上传文件,一次一张 
    61.      */  
    62.     @RequestMapping("/onefile2")  
    63.     public String oneFileUpload2(HttpServletRequest request,  
    64.             HttpServletResponse response) throws Exception {  
    65.         CommonsMultipartResolver cmr = new CommonsMultipartResolver(  
    66.                 request.getServletContext());  
    67.         if (cmr.isMultipart(request)) {  
    68.             MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) (request);  
    69.             Iterator<String> files = mRequest.getFileNames();  
    70.             while (files.hasNext()) {  
    71.                 MultipartFile mFile = mRequest.getFile(files.next());  
    72.                 if (mFile != null) {  
    73.                     String fileName = UUID.randomUUID()  
    74.                             + mFile.getOriginalFilename();  
    75.                     String path = "d:/upload/" + fileName;  
    76.   
    77.                     File localFile = new File(path);  
    78.                     mFile.transferTo(localFile);  
    79.                     request.setAttribute("fileUrl", path);  
    80.                 }  
    81.             }  
    82.         }  
    83.         return "fileUpload";  
    84.     }  
    85. }  

    (2)JSP,这个页面是用来上传又用来显示上传后的图片的页面fileUpload.jsp

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
    2.     pageEncoding="UTF-8"%>  
    3. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>  
    4. <%  
    5.     String path = request.getContextPath();  
    6.     String basePath = request.getScheme() + "://"  
    7.             + request.getServerName() + ":" + request.getServerPort()  
    8.             + path + "/";  
    9. %>  
    10. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    11. <html>  
    12. <head>  
    13. <title>用户上传图片页面</title>  
    14.  <base href="<%=basePath%>">  
    15. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    16. </head>  
    17. <body>  
    18.     <center>  
    19.         <form action="file/onefile"  
    20.             method="post" enctype="multipart/form-data">  
    21.             <input type="file" name="file" />   
    22.             <input type="submit" value="上 传" />  
    23.         </form>  
    24.         <h5>上传结果:</h5>  
    25.         <img alt="暂无图片" src="${fileUrl}" />  
    26.     </center>  
    27. </body>  
    28. </html>  

    现在运行后来看看效果,输入:http://localhost:8080/SpringMVCLearningChapter4_1/file/toFile

    控制台输出结果,选择图片后

    原始文件名:Chrysanthemum.jpg
    上传图片到:E:workspace.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsSpringMVCLearningChapter4_1img/4eafc28c-4baa-4018-ac06-c4a5aec88d6cChrysanthemum.jpg

    图片已被上传,可以在JSP中显示出来

    来看看服务器的路径:E:workspace.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsSpringMVCLearningChapter4_1img

    表明图片已经上传到服务器

    方法二:

    使用文件流的方式来上传

     

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 方法二上传文件,一次一张 
    3.  */  
    4. @RequestMapping("/onefile2")  
    5. public String oneFileUpload2(HttpServletRequest request,  
    6.         HttpServletResponse response) throws Exception {  
    7.     CommonsMultipartResolver cmr = new CommonsMultipartResolver(  
    8.             request.getServletContext());  
    9.     if (cmr.isMultipart(request)) {  
    10.         MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) (request);  
    11.         Iterator<String> files = mRequest.getFileNames();  
    12.         while (files.hasNext()) {  
    13.             MultipartFile mFile = mRequest.getFile(files.next());  
    14.             if (mFile != null) {  
    15.                 String fileName = UUID.randomUUID()  
    16.                         + mFile.getOriginalFilename();  
    17.                 String path = "d:/upload/" + fileName;  
    18.   
    19.                 File localFile = new File(path);  
    20.                 mFile.transferTo(localFile);  
    21.                 request.setAttribute("fileUrl", path);  
    22.             }  
    23.         }  
    24.     }  
    25.     return "fileUpload";  
    26. }  

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <center>  
    2.     <form action="file/onefile"  
    3.         method="post" enctype="multipart/form-data">  
    4.         <input type="file" name="file" />   
    5.         <input type="submit" value="上 传" />  
    6.     </form>  
    7.     <h5>上传结果:</h5>  
    8.     <img alt="暂无图片" src="${fileUrl}" />  
    9. </center>  

    中的

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <form action="file/onefile"  

    改成

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <form action="file/onefile2"  

    输入:http://localhost:8080/SpringMVCLearningChapter4_1/file/toFile

    方法二指定上传到了本地E盘的upload文件夹

    页面结果

    四、多文件上传

    (1)控制器

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @RequestMapping("/toFile2")  
    2. public String toFileUpload2() {  
    3.     return "fileUpload2";  
    4. }  

     

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 一次上传多张图片 
    3.  */  
    4. @RequestMapping("/threeFile")  
    5. public String threeFileUpload(  
    6.         @RequestParam("file") CommonsMultipartFile files[],  
    7.         HttpServletRequest request, ModelMap model) {  
    8.   
    9.     List<String> list = new ArrayList<String>();  
    10.     // 获得项目的路径  
    11.     ServletContext sc = request.getSession().getServletContext();  
    12.     // 上传位置  
    13.     String path = sc.getRealPath("/img") + "/"; // 设定文件保存的目录  
    14.     File f = new File(path);  
    15.     if (!f.exists())  
    16.         f.mkdirs();  
    17.   
    18.     for (int i = 0; i < files.length; i++) {  
    19.         // 获得原始文件名  
    20.         String fileName = files[i].getOriginalFilename();  
    21.         System.out.println("原始文件名:" + fileName);  
    22.         // 新文件名  
    23.         String newFileName = UUID.randomUUID() + fileName;  
    24.         if (!files[i].isEmpty()) {  
    25.             try {  
    26.                 FileOutputStream fos = new FileOutputStream(path  
    27.                         + newFileName);  
    28.                 InputStream in = files[i].getInputStream();  
    29.                 int b = 0;  
    30.                 while ((b = in.read()) != -1) {  
    31.                     fos.write(b);  
    32.                 }  
    33.                 fos.close();  
    34.                 in.close();  
    35.             } catch (Exception e) {  
    36.                 e.printStackTrace();  
    37.             }  
    38.         }  
    39.         System.out.println("上传图片到:" + path + newFileName);  
    40.         list.add(path + newFileName);  
    41.   
    42.     }  
    43.     // 保存文件地址,用于JSP页面回显  
    44.     model.addAttribute("fileList", list);  
    45.     return "fileUpload2";  
    46.   
    47. }  

    其实就是在单文件上传的方法一中来修改的,只不过弄成了个循环

    (2)JSP显示页面fileUpload2.jsp

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"  
    2.     pageEncoding="UTF-8"%>  
    3. <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>  
    4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
    5. <%  
    6.     String path = request.getContextPath();  
    7.     String basePath = request.getScheme() + "://"  
    8.             + request.getServerName() + ":" + request.getServerPort()  
    9.             + path + "/";  
    10. %>  
    11. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    12. <html>  
    13. <head>  
    14. <title>用户上传图片页面</title>  
    15. <base href="<%=basePath%>">  
    16. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    17. </head>  
    18. <body>  
    19.     <center>  
    20.         <form action="file/threeFile" method="post"  
    21.             enctype="multipart/form-data">  
    22.             <input type="file" name="file" /><br /> <input type="file"  
    23.                 name="file" /><br /> <input type="file" name="file" /><br /> <input  
    24.                 type="submit" value="上 传" />  
    25.         </form>  
    26.         <h5>上传结果:</h5>  
    27.   
    28.         <c:forEach items="${fileList}" var="imagename">  
    29.                 <img alt="暂无图片" src="${imagename}" /> <br/>  
    30.         </c:forEach>  
    31.   
    32.   
    33.   
    34.     </center>  
    35. </body>  
    36. </html>  

    注意这里用了

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. </c:forEach>  

    表单,需要jstl.jar+standard.jar

    (3)运行后输入:http://localhost:8080/SpringMVCLearningChapter4_1/file/toFile2(注意上面是单文件没有后面的数字2)

    选择图片,然后点上传

    控制台输出结果:

    图片不清看文字 吧:

    原始文件名:Desert.jpg
    上传图片到:E:workspace.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsSpringMVCLearningChapter4_1img/2baccc77-43b6-4908-859d-507e86a04051Desert.jpg
    原始文件名:Hydrangeas.jpg
    上传图片到:E:workspace.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsSpringMVCLearningChapter4_1img/51ad04e0-82aa-4b2c-958d-f00651e9ed6bHydrangeas.jpg
    原始文件名:Jellyfish.jpg
    上传图片到:E:workspace.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsSpringMVCLearningChapter4_1img/dee340d8-9cc0-41ae-9959-f7fa47ff172bJellyfish.jpg

    三张图片都可以显示出来了

    来看看服务器,这就是刚刚上传的三张

    五、上传文件列表显示

    (1)控制器

     

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /** 
    2.  * 列出所有的图片 
    3.  */  
    4. @RequestMapping("/listFile")  
    5. public String listFile(HttpServletRequest request,  
    6.         HttpServletResponse response) {  
    7.     // 获取上传文件的目录  
    8.     ServletContext sc = request.getSession().getServletContext();  
    9.     // 上传位置  
    10.     String uploadFilePath = sc.getRealPath("/img") + "/"; // 设定文件保存的目录  
    11.     // 存储要下载的文件名  
    12.     Map<String, String> fileNameMap = new HashMap<String, String>();  
    13.     // 递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中  
    14.     listfile(new File(uploadFilePath), fileNameMap);// File既可以代表一个文件也可以代表一个目录  
    15.     // 将Map集合发送到listfile.jsp页面进行显示  
    16.     request.setAttribute("fileNameMap", fileNameMap);  
    17.     return "listFile";  
    18. }  

    (2)JSP文件listFile.jsp

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
    3. <!DOCTYPE HTML>  
    4. <html>  
    5.   <head>  
    6.     <title>下载文件显示页面</title>  
    7.   </head>  
    8.     
    9.   <body>  
    10.       <!-- 遍历Map集合 -->  
    11.     <c:forEach var="me" items="${fileNameMap}">  
    12.         <c:url value="/file/downFile" var="downurl">  
    13.             <c:param name="filename" value="${me.key}"></c:param>  
    14.         </c:url>  
    15.         ${me.value}<href="${downurl}">下载</a>  
    16.         <br/>  
    17.     </c:forEach>   
    18.     
    19.   </body>  
    20. </html>  


    (3)运行后输入:http://localhost:8080/SpringMVCLearningChapter4_1/file/listFile       

    这些为刚刚上传到四张图片。

    六、文件下载

    (1)控制器

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @RequestMapping("/downFile")  
    2. public void downFile(HttpServletRequest request,  
    3.         HttpServletResponse response) {  
    4.     System.out.println("1");  
    5.     // 得到要下载的文件名  
    6.     String fileName = request.getParameter("filename");  
    7.     System.out.println("2");  
    8.     try {  
    9.         fileName = new String(fileName.getBytes("iso8859-1"), "UTF-8");  
    10.         System.out.println("3");  
    11.         // 获取上传文件的目录  
    12.         ServletContext sc = request.getSession().getServletContext();  
    13.         System.out.println("4");  
    14.         // 上传位置  
    15.         String fileSaveRootPath = sc.getRealPath("/img");   
    16.           
    17.         System.out.println(fileSaveRootPath + "\" + fileName);  
    18.         // 得到要下载的文件  
    19.         File file = new File(fileSaveRootPath + "\" + fileName);  
    20.           
    21.         // 如果文件不存在  
    22.         if (!file.exists()) {  
    23.             request.setAttribute("message", "您要下载的资源已被删除!!");  
    24.             System.out.println("您要下载的资源已被删除!!");  
    25.             return;  
    26.         }  
    27.         // 处理文件名  
    28.         String realname = fileName.substring(fileName.indexOf("_") + 1);  
    29.         // 设置响应头,控制浏览器下载该文件  
    30.         response.setHeader("content-disposition", "attachment;filename="  
    31.                 + URLEncoder.encode(realname, "UTF-8"));  
    32.         // 读取要下载的文件,保存到文件输入流  
    33.         FileInputStream in = new FileInputStream(fileSaveRootPath + "\" + fileName);  
    34.         // 创建输出流  
    35.         OutputStream out = response.getOutputStream();  
    36.         // 创建缓冲区  
    37.         byte buffer[] = new byte[1024];  
    38.         int len = 0;  
    39.         // 循环将输入流中的内容读取到缓冲区当中  
    40.         while ((len = in.read(buffer)) > 0) {  
    41.             // 输出缓冲区的内容到浏览器,实现文件下载  
    42.             out.write(buffer, 0, len);  
    43.         }  
    44.         // 关闭文件输入流  
    45.         in.close();  
    46.         // 关闭输出流  
    47.         out.close();  
    48.     } catch (Exception e) {  
    49.   
    50.     }  
    51. }  


    这里就是通过文件流的方式来下载图片的。

    然后就可以自己选择下载的地方了。

    终于讲完了,花了大半天啊!

    本文工程免费下载

      林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

    http://blog.csdn.net/evankaka/article/details/45826697

     

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/softidea/p/5271890.html
Copyright © 2011-2022 走看看