springboot的文件上传比较简单

一、使用默认的Resolver:StandardServletMultipartResolver

controller

  1. package com.mydemo.webdemo.controller;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.Date;
  10. import java.util.List;
  11.  
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.ui.Model;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.multipart.MultipartFile;
  21. import org.springframework.web.servlet.ModelAndView;
  22.  
  23. @Controller
  24. @RequestMapping("/")
  25. public class FileUploadController {
  26.  
  27. private Logger logger = LoggerFactory.getLogger(FileUploadController.class);
  28. @Value("${upload.file.savepath:/tmp}")
  29. private String savePath;
  30.  
  31. @RequestMapping("/toupload")
  32. public ModelAndView toWelcome() {
  33. ModelAndView mav = new ModelAndView();
  34. mav.setViewName("fileupload");
  35. mav.addObject("time", new Date());
  36. return mav;
  37. }
  38.  
  39. /**
  40. * 使用model传值
  41. *
  42. * @param uploadFile
  43. * @param model
  44. * @return
  45. */
  46. @PostMapping("/uploadone")
  47. public String uploadSingleFile(@RequestParam("uploadFile") MultipartFile uploadFile, Model model) {
  48. List<MultipartFile> uploadFileList = new ArrayList<>();
  49. logger.info(uploadFile.toString());
  50. try {
  51. uploadFileList.add(uploadFile);
  52. String result = saveFile(uploadFileList);
  53. model.addAttribute("msg", result);
  54. } catch (Exception e) {
  55. model.addAttribute("msg", "Upload failed");
  56. e.printStackTrace();
  57. }
  58. return "uploadResult";
  59. }
  60.  
  61. /**
  62. * 使用ModelAndView页面跳转和传值
  63. *
  64. * @param uploadFile
  65. * @return
  66. */
  67. @PostMapping("/uploadmore")
  68. public ModelAndView uploadMoreFile(@RequestParam("uploadFile") MultipartFile[] uploadFile) {
  69. ModelAndView mav = new ModelAndView();
  70. List<MultipartFile> uploadFileList = new ArrayList<>();
  71. try {
  72. uploadFileList.addAll(Arrays.asList(uploadFile));
  73. String result = saveFile(uploadFileList);
  74. mav.addObject("msg", result);
  75. } catch (Exception e) {
  76. mav.addObject("msg", "Upload failed");
  77. e.printStackTrace();
  78. }
  79. mav.setViewName("uploadResult");
  80. return mav;
  81. }
  82.  
  83. private String saveFile(List<MultipartFile> uploadFileList) {
  84. int successNum = 0;
  85. for (MultipartFile uploadFile : uploadFileList) {
  86. InputStream is = null;
  87. FileOutputStream fos = null;
  88. try {
  89. String fileName = uploadFile.getOriginalFilename();
  90. is = uploadFile.getInputStream();
  91. fos = new FileOutputStream(savePath + File.separator + fileName);
  92. int len = 0;
  93. byte[] b = new byte[1024];
  94. while ((len = (is.read(b))) != -1) {
  95. fos.write(b, 0, len);
  96. }
  97. successNum += 1;
  98. } catch (Exception e) {
  99. e.printStackTrace();
  100. } finally {
  101. try {
  102. if (is != null) {
  103. is.close();
  104. }
  105. if (fos != null) {
  106. fos.close();
  107. }
  108. } catch (IOException e) {
  109. e.printStackTrace();
  110. }
  111. }
  112. }
  113. if (successNum == 0) {
  114. return "Upload failed";
  115. } else if (successNum == uploadFileList.size()) {
  116. return "Upload success";
  117. } else {
  118. return "Partial upload success";
  119. }
  120.  
  121. }
  122. }

src/main/resources/templates/fileupload.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Insert title here</title>
  6. </head>
  7. <body>
  8. Current time:<span th:text=${time} /><br />
  9. <h5>===========================分割线=============================</h5>
  10. <form id = "uploadone" action="${request}" th:action="@{/uploadone}" method="post" enctype="multipart/form-data">
  11. <input type="file" name="uploadFile" /><br />
  12. <input type="submit" value="UploadOne">
  13. </form>
  14. <h5>===========================分割线=============================</h5>
  15. <form id = "uploadmore" action="${request}" th:action="@{/uploadmore}" method="post" enctype="multipart/form-data">
  16. <input type="file" name="uploadFile" /><br />
  17. <input type="file" name="uploadFile" /><br />
  18. <input type="file" name="uploadFile" /><br />
  19. <input type="submit" value="UploadMore">
  20. </form>
  21. </body>
  22. </html>

src/main/resources/templates/uploadResult.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Insert title here</title>
  6. </head>
  7. <body>
  8. <span th:text=${msg}/>
  9. </body>
  10. </html>

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.1.4.RELEASE</version>
  10. <relativePath /> <!-- lookup parent from repository -->
  11. </parent>
  12. <groupId>com.mydemo.webdemo</groupId>
  13. <artifactId>fileuploaddemo</artifactId>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>fileuploaddemo</name>
  16. <description>Demo project for Spring Boot</description>
  17.  
  18. <properties>
  19. <java.version>1.8</java.version>
  20. </properties>
  21.  
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  30. </dependency>
  31.  
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>
  46.  
  47. </project>

application.properties

  1. spring.mvc.servlet.load-on-startup=1
  2. server.servlet.context-path=/uploaddemo
  3. upload.file.savepath=D:/upload
  4. ## per file size, 500M
  5. spring.servlet.multipart.max-file-size=524288000
  6. ## max file size in one request, 600M
  7. spring.servlet.multipart.max-request-size=629145600
  8. ## in memory size after write to disk, 10M
  9. spring.servlet.multipart.file-size-threshold=10240

二、使用CommonsMultipartResolver

在第一步操作的基础上,注册multipartResolver的bean为CommonsMultipartResolver

  1. package com.mydemo.webdemo.custombean;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  6.  
  7. @Component
  8. public class CustomBean {
  9. @Bean(name = "multipartResolver")
  10. public CommonsMultipartResolver getMultipartResolver() {
  11. CommonsMultipartResolver resolver = new CommonsMultipartResolver();
  12. resolver.setDefaultEncoding("UTF-8");// default ISO-8859-1
  13. resolver.setMaxInMemorySize(10240);// default 10240 ,单位bytes
  14. resolver.setMaxUploadSize(1024*1024*600);// default -1 ,无限制,单位bytes
  15. resolver.setMaxUploadSizePerFile(1024*1024*500);// default -1 ,无限制,单位bytes
  16. return resolver;
  17. }
  18.  
  19. }

pom.xml文件中需要添加commons-fileupload依赖

  1. <dependency>
  2. <groupId>commons-fileupload</groupId>
  3. <artifactId>commons-fileupload</artifactId>
  4. <version>1.4</version>
  5. </dependency>

application.properties配置中去掉上述包含multipart的三个参数,保留如下

  1. spring.mvc.servlet.load-on-startup=1
  2. server.servlet.context-path=/uploaddemo
  3. upload.file.savepath=D:/upload

三、文件下载

在上述基础上,添加下载Controller

  1. package com.mydemo.webdemo.controller;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7.  
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.stereotype.Controller;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16.  
  17. @Controller
  18. public class DownloadController {
  19. private Logger logger = LoggerFactory.getLogger(FileUploadController.class);
  20.  
  21. @RequestMapping("/download")
  22. @ResponseBody
  23. public void download(HttpServletRequest request, HttpServletResponse response) {
  24. String fileName = request.getParameter("fileName");
  25. String filePah = "D:/upload" + File.separator + fileName;
  26. // 自动判断下载文件类型
  27. response.setContentType("multipart/form-data");
  28. // 设置文件名称
  29. response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
  30. FileInputStream fis = null;
  31. OutputStream out = null;
  32. try {
  33. fis = new FileInputStream(filePah);
  34. out = response.getOutputStream();
  35. byte[] b = new byte[1024];
  36. int len;
  37. while ((len = fis.read(b)) != -1) {
  38. out.write(b, 0, len);
  39. }
  40. } catch (IOException e) {
  41. logger.error("", e);
  42. } finally {
  43. try {
  44. if (fis != null) {
  45. fis.close();
  46. }
  47. if (out != null) {
  48. out.close();
  49. }
  50. } catch (IOException e) {
  51. logger.error("", e);
  52. }
  53. }
  54. }
  55. }

D:\upload\upload.tar文件存在,则可通过如下链接下载该文件

http://localhost:8080/uploaddemo/download?fileName=upload.tar

遗留问题:

1、当上传文件大小超过了文件限制大小后,不能将异常信息传递给前端,比如本例中单个文件大小设置为500M,上传大于500M的单个文件,出现异常,但不能将该异常信息传递给前端正常显示

springboot文件上传下载简单使用的更多相关文章

  1. springmvc文件上传下载简单实现案例(ssm框架使用)

    springmvc文件上传下载实现起来非常简单,此springmvc上传下载案例适合已经搭建好的ssm框架(spring+springmvc+mybatis)使用,ssm框架项目的搭建我相信你们已经搭 ...

  2. SpringBoot文件上传下载

    项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载. 新建springboot项目,前台页面使用的thymeleaf模板,其余的没有特别的配置,pom代码如 ...

  3. springboot文件上传下载,转载的

    Spring Boot入门——文件上传与下载 原文来自:https://www.cnblogs.com/studyDetail/articles/7003253.html 1.在pom.xml文件中添 ...

  4. springboot 文件上传下载

    关键点: 1,使用 POST 请求2,consumes=MediaType.MULTIPART_FROM_DATA_VALUE3,@RequestParm 里面的字符串和前端 input 控件的 na ...

  5. salesforce 零基础学习(四十二)简单文件上传下载

    项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...

  6. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

  7. 补习系列(11)-springboot 文件上传原理

    目录 一.文件上传原理 二.springboot 文件机制 临时文件 定制配置 三.示例代码 A. 单文件上传 B. 多文件上传 C. 文件上传异常 D. Bean 配置 四.文件下载 小结 一.文件 ...

  8. SpringMVC文件上传下载(单文件、多文件)

    前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...

  9. commons-fileupload实现文件上传下载

    commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...

随机推荐

  1. 逆向-攻防世界-crackme

    查壳,nSpack壳,直接用软件脱壳,IDA载入程序. 很明显,就是将402130的数据和输入的数据进行异或,判断是否等于402150处的数据.dwrd占4字节. 这道题主要记录一下刚学到的,直接在I ...

  2. Arduino入门笔记(5):1602液晶实验(实现时钟)

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...

  3. STM32的IAP实现

    STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556   IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...

  4. 使用 Node.js 搭建 Web 服务器

    使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块.文件系统.url解析模块.路径解析模块.以及301重定向技术等, ...

  5. 快速构建SPA框架SalutJS--项目工程目录 二

    目录结构 上面这张图是salut的目录文档,从github上将其下载后直接运行node run和 node json 可以直接启动项目.下面逐个介绍每个目录的存放的文件和作用. constructio ...

  6. 解决MUI阻止a标签默认跳转事件—方法总结

    用过mui的小伙伴们一定不会陌生,有时候真的很烦mui本身会阻止a标签默认跳转.一般只要用了mui的ui组件,比如头部,底部或者弹框,你就不能在用a标签进行跳转了. 注:项目中引用了mui后,可能也会 ...

  7. 难以理解的AQS(下)

    在上一篇博客,简单的说下了AQS的基本概念,核心源码解析,但是还有一部分内容没有涉及到,就是AQS对条件变量的支持,这篇博客将着重介绍这方面的内容. 条件变量 基本应用 我们先通过模拟一个消费者/生产 ...

  8. cassandra读源码---Streaming

    前言 cassandra的很多过程需要网络传输模块,需要在各个节点直接发送文件.包括加入节点,删除节点引起的不同节点的负责ring环的key值发生了变化,导致sstable需要在各个节点中移动. 整体 ...

  9. 用ASP.NET Core 2.0 建立规范的 REST API -- DELETE, UPDATE, PATCH 和 Log

    本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...

  10. 【ElasticSearch篇】--ElasticSearch从初识到安装和应用

    一.前述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,在企业中全文搜索时,特别常用. 二.常用概念 clu ...