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

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

整个相关的包如下:

整个工程目录如下:

二、配置web.xml和SpringMVC文件

(1)web.xml

  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文件

  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)控制器

  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

  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\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringMVCLearningChapter4_1\img/4eafc28c-4baa-4018-ac06-c4a5aec88d6cChrysanthemum.jpg

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

来看看服务器的路径:E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringMVCLearningChapter4_1\img

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

方法二:

使用文件流的方式来上传

  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. }

  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>

中的

<form action="file/onefile"

改成

<form action="file/onefile2"

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

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

页面结果

四、多文件上传

(1)控制器

  1. @RequestMapping("/toFile2")
  2. public String toFileUpload2() {
  3. return "fileUpload2";
  4. }
  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

  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>

注意这里用了

</c:forEach>

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

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

选择图片,然后点上传

控制台输出结果:

图片不清看文字 吧:

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

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

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

五、上传文件列表显示

(1)控制器

  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

  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}<a href="${downurl}">下载</a>
  16. <br/>
  17. </c:forEach>
  18.  
  19. </body>
  20. </html>

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

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

六、文件下载

(1)控制器

  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

[转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载的更多相关文章

  1. SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...

  2. springmvc单文件上传

    1.创建上传页面 <form action="first.do" method="post" enctype="multipart/form-d ...

  3. Springmvc+uploadify实现文件带进度条批量上传

    网上看了很多关于文件上传的帖子,众口不一,感觉有点乱,最近正好公司的项目里用到JQuery的uploadify控件做文件上传,所以整理下头绪,搞篇文档出来,供亲们分享. Uploadify控件的主要优 ...

  4. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

  5. SpringMVC【参数绑定、数据回显、文件上传】

    前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...

  6. ajax 提交所有表单内容及上传图片(文件),以及单独上传某个图片(文件)

    我以演示上传图片为例子: java代码如下(前端童鞋可以直接跳过看下面的html及js): package com.vatuu.web.action; import java.io.File; imp ...

  7. spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)

    一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...

  8. SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)

    Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...

  9. SpringMvc+jQuery 文件拖拽上传、选择上传

    最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...

随机推荐

  1. mysqld Can’t start server : Bind on unix socket: Permission denied

    启动mysql报错: mysqld Can’t start server : Bind on unix socket: Permission denied 原因: mysql.sock无法建立,权限问 ...

  2. 【转】我为什么离开 Cornell

    我为什么离开 Cornell 很多人都知道,我曾经在 Cornell 博士就读,两年之后转学到了 Indiana 大学.几乎所有人,包括 Indiana 大学的人都感觉奇怪,为什么会有人从 Corne ...

  3. 企业内知识库wiki所存在的问题

    相信很多公司都利用开源的wiki web app搭建了自家的内部wiki服务,比如使用media Wiki, Gollum, doku wiki, jsWiki等 但是,真正可用的企业wiki系统却没 ...

  4. mongodb3.4 安装及用户名密码设置

    下载: https://www.mongodb.com/download-center?jmp=nav#community 1.解压  修改文件名为mongo3.2.5,执行命令如下: mv mong ...

  5. JQ:命令行 json 解析神器 —— 命令行的Jsonview

  6. Echarts 新认知 地图的label到底怎么居中?

    试过了offset和很多Api,都无法实现label居中 后来无意中发现,原来在geojson注册的时候,可以定义 properties.cp 属性,实现文本的坐标自定义,实现居中. echarts. ...

  7. 转 redis 锁

    原文链接: http://www.promptness.cn/article/34 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的 ...

  8. Starting with neural network in matlab[zz]

    转自:http://matlabbyexamples.blogspot.com/2011/03/starting-with-neural-network-in-matlab.html The neur ...

  9. Google Mesa概览

    Google Mesa的文章:https://research.google.com/pubs/pub42851.html  https://gigaom.com/2014/08/07/google- ...

  10. Ubuntu中开启和关闭防火墙-摘自网络

    1.关闭ubuntu的防火墙 ufw disable开启防火墙ufw enable 2.卸载了iptablesapt-get remove iptables3.关闭ubuntu中的防火墙的其余命令ip ...