经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Spring MVC 实现文件的上传和下载
来源:cnblogs  作者:黄浩#  时间:2018/11/3 10:08:24  对本文有异议

SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,只要在 spring-mvc.xml 中注册相应的 MultipartResolver 即可。

MultipartResolver 的实现类有两个:

  1. CommonsMultipartResolver
  2. StandardServletMultipartResolver

两个的区别:

  1. 第一个需要使用 Apache 的 commons-fileupload 等 jar 包支持,但它能在比较旧的 servlet 版本中使用。
  2. 第二个不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用。

第一个使用步骤:

  1. /*CommonsMultipartResolver 上传用到的两个包*/

    "commons-fileupload:commons-fileupload:1.3.1",

    "commons-io:commons-io:2.4"

如果是maven项目的话直接导入:

  1. <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency>

    dispatcher-servlet.xml配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7.  
  8. <context:component-scan base-package="edu.nf.ch08.controller"/>
  9.  
  10. <mvc:annotation-driven/>
  11.  
  12. <mvc:default-servlet-handler/>
  13. <!-- 文件上传有两种方式,一种基于Servlet3.0的上传,一种基于
  14. commons-upload上传,如果使用Servlet3.0的上传方式,可以
  15. 不需要配置MultipartResolver,Spring默认会注册一个
  16. StandardServletMultipartResolver。只需要在web.xml中
  17. 启用<multipart-config>。
  18. 如果想使用commons-upload,那么需要配置一个CommonsMultipartResolver,
  19. 且指定bean的id为multipartResolver-->
  20. <!-- 这里使用commons-upload-->
  21. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  22. <!-- 限制文件上传的总大小(单位:字节),不配置此属性默认不限制 -->
  23. <property name="maxUploadSize" value="104857600"/>
  24. <!-- 设置文件上传的默认编码-->
  25. <property name="defaultEncoding" value="utf-8"/>
  26. </bean>
  27.  
  28. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  29. <property name="prefix" value="/WEB-INF/jsp/"/>
  30. <property name="suffix" value=".jsp"/>
  31. </bean>
  32. </beans>

 web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6.  
  7. <!-- 请求总控器 -->
  8. <servlet>
  9. <servlet-name>dispatcher</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:dispatcher-servlet.xml</param-value>
  14. </init-param>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>dispatcher</servlet-name>
  18. <url-pattern>/</url-pattern>
  19. </servlet-mapping>
  20.  
  21. </web-app>

后台java(上传、下载)处理代码:

  1. package edu.nf.ch08.controller;
  2. import org.apache.commons.io.FileUtils;
  3. import org.springframework.http.HttpHeaders;
  4. import org.springframework.http.HttpStatus;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.PostMapping;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import org.springframework.web.servlet.ModelAndView;
  12. import java.io.File;
  13. import java.io.IOException;
  14. /**
  15. * @author wangl
  16. * @date 2018/11/2
  17. */
  18. @Controller
  19. public class UploadController {
  20. /**
  21. * 文件上传只需要Spring传入一个MultipartFile对象即可,
  22. * 这个对象可以获取文件相关上传的信息。
  23. * 一个MultipartFile表示单个文件上传,当需要上传多个文件时
  24. * 只需要声明为MultipartFile[]数组即可。
  25. * @return
  26. */
  27. @PostMapping("/upload")
  28. public ModelAndView upload(MultipartFile file){
  29. //获取当前系统用户目录
  30. String home = System.getProperty("user.home");
  31. //指定上传的文件夹目录
  32. File uploadDir = new File(home + "/files");
  33. //如果目录不存在,则创建
  34. if(!uploadDir.exists()){
  35. uploadDir.mkdir();
  36. }
  37. //获取上传的文件名
  38. String fileName = file.getOriginalFilename();
  39. //构建一个完整的文件上传对象
  40. File uploadFile = new File(uploadDir.getAbsolutePath() + "/" + fileName);
  41. try {
  42. //通过transferTo方法进行上传
  43. file.transferTo(uploadFile);
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. throw new RuntimeException(e.getMessage());
  47. }
  48. //将文件名存入Model,转发到index页面
  49. ModelAndView mv = new ModelAndView("index");
  50. mv.addObject("fileName", fileName);
  51. return mv;
  52. }
  53. /**
  54. * 文件下载
  55. * 读取服务器本地文件并封装为ResponseEntity对象
  56. * 响应客户端,写回的是一个字节数组
  57. * @param fileName 文件名
  58. * @return
  59. */
  60. @GetMapping("/download")
  61. public ResponseEntity<byte[]> download(String fileName){
  62. //依据文件名构建本地文件路径
  63. String filePath = System.getProperty("user.home") + "/files/" + fileName;
  64. //依据文件路径构建File对象
  65. File file = new File(filePath);
  66. //创建响应头对象,设置响应信息
  67. HttpHeaders headers = new HttpHeaders();
  68. try {
  69. //对文件名进行重新编码,防止在响应头中出现中文乱码
  70. String headerFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
  71. //设置响应内容处理方式为附件,并指定文件名
  72. headers.setContentDispositionFormData("attachment", headerFileName);
  73. //设置响应头类型为application/octet-stream,表示是一个流类型
  74. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  75. //将文件转换成字节数组
  76. byte[] bytes = FileUtils.readFileToByteArray(file);
  77. //创建ResponseEntity对象(封装文件字节数组、响应头、响应状态码)
  78. ResponseEntity<byte[]> entity = new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);
  79. //最后将整个ResponseEntity对象返回给DispatcherServlet
  80. return entity;
  81. } catch (Exception e) {
  82. e.printStackTrace();
  83. throw new RuntimeException("文件下载失败");
  84. }
  85. }
  86. }

上传文件的网页html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>文件上传</h1>
  9. <!-- 当有文件上传时,表单的enctype必须设置为multipart/form-data -->
  10. <form method="post" action="upload" enctype="multipart/form-data">
  11. File:<input type="file" name="file"/><br/>
  12. <input type="submit" value="submit"/>
  13. </form>
  14. </body>
  15. </html>

 

上传成功后转发的jsp(下载文件)页面:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: wangl
  4. Date: 2018/11/2
  5. Time: 09:56
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>Title</title>
  12. </head>
  13. <body>
  14. <a href="download?fileName=${fileName}">${fileName}</a>
  15. </body>
  16. </html>

 

项目结构:

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号