springboot的文件上传比较简单

一、使用默认的Resolver:StandardServletMultipartResolver

controller

package com.mydemo.webdemo.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping("/")
public class FileUploadController { private Logger logger = LoggerFactory.getLogger(FileUploadController.class);
@Value("${upload.file.savepath:/tmp}")
private String savePath; @RequestMapping("/toupload")
public ModelAndView toWelcome() {
ModelAndView mav = new ModelAndView();
mav.setViewName("fileupload");
mav.addObject("time", new Date());
return mav;
} /**
* 使用model传值
*
* @param uploadFile
* @param model
* @return
*/
@PostMapping("/uploadone")
public String uploadSingleFile(@RequestParam("uploadFile") MultipartFile uploadFile, Model model) {
List<MultipartFile> uploadFileList = new ArrayList<>();
logger.info(uploadFile.toString());
try {
uploadFileList.add(uploadFile);
String result = saveFile(uploadFileList);
model.addAttribute("msg", result);
} catch (Exception e) {
model.addAttribute("msg", "Upload failed");
e.printStackTrace();
}
return "uploadResult";
} /**
* 使用ModelAndView页面跳转和传值
*
* @param uploadFile
* @return
*/
@PostMapping("/uploadmore")
public ModelAndView uploadMoreFile(@RequestParam("uploadFile") MultipartFile[] uploadFile) {
ModelAndView mav = new ModelAndView();
List<MultipartFile> uploadFileList = new ArrayList<>();
try {
uploadFileList.addAll(Arrays.asList(uploadFile));
String result = saveFile(uploadFileList);
mav.addObject("msg", result);
} catch (Exception e) {
mav.addObject("msg", "Upload failed");
e.printStackTrace();
}
mav.setViewName("uploadResult");
return mav;
} private String saveFile(List<MultipartFile> uploadFileList) {
int successNum = 0;
for (MultipartFile uploadFile : uploadFileList) {
InputStream is = null;
FileOutputStream fos = null;
try {
String fileName = uploadFile.getOriginalFilename();
is = uploadFile.getInputStream();
fos = new FileOutputStream(savePath + File.separator + fileName);
int len = 0;
byte[] b = new byte[1024];
while ((len = (is.read(b))) != -1) {
fos.write(b, 0, len);
}
successNum += 1;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (successNum == 0) {
return "Upload failed";
} else if (successNum == uploadFileList.size()) {
return "Upload success";
} else {
return "Partial upload success";
} }
}

src/main/resources/templates/fileupload.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Current time:<span th:text=${time} /><br />
<h5>===========================分割线=============================</h5>
<form id = "uploadone" action="${request}" th:action="@{/uploadone}" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" /><br />
<input type="submit" value="UploadOne">
</form>
<h5>===========================分割线=============================</h5>
<form id = "uploadmore" action="${request}" th:action="@{/uploadmore}" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" /><br />
<input type="file" name="uploadFile" /><br />
<input type="file" name="uploadFile" /><br />
<input type="submit" value="UploadMore">
</form>
</body>
</html>

src/main/resources/templates/uploadResult.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<span th:text=${msg}/>
</body>
</html>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.mydemo.webdemo</groupId>
<artifactId>fileuploaddemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>fileuploaddemo</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

application.properties

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

二、使用CommonsMultipartResolver

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

package com.mydemo.webdemo.custombean;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.commons.CommonsMultipartResolver; @Component
public class CustomBean {
@Bean(name = "multipartResolver")
public CommonsMultipartResolver getMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");// default ISO-8859-1
resolver.setMaxInMemorySize(10240);// default 10240 ,单位bytes
resolver.setMaxUploadSize(1024*1024*600);// default -1 ,无限制,单位bytes
resolver.setMaxUploadSizePerFile(1024*1024*500);// default -1 ,无限制,单位bytes
return resolver;
} }

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

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>

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

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

三、文件下载

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

package com.mydemo.webdemo.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
public class DownloadController {
private Logger logger = LoggerFactory.getLogger(FileUploadController.class); @RequestMapping("/download")
@ResponseBody
public void download(HttpServletRequest request, HttpServletResponse response) {
String fileName = request.getParameter("fileName");
String filePah = "D:/upload" + File.separator + fileName;
// 自动判断下载文件类型
response.setContentType("multipart/form-data");
// 设置文件名称
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
FileInputStream fis = null;
OutputStream out = null;
try {
fis = new FileInputStream(filePah);
out = response.getOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b)) != -1) {
out.write(b, 0, len);
}
} catch (IOException e) {
logger.error("", e);
} finally {
try {
if (fis != null) {
fis.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
logger.error("", e);
}
}
}
}

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. JavaScript正则表达式基础

    ECMAScript 3 开始支持正则表达式,其语法和 Perl 语法很类似,一个完整的正则表达式结构如下: var expression = / pattern / flags ; 其中,模式(pa ...

  2. ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署

    背景: 这周,心情来潮,想把 Aries 开发框架 和 Taurus 开发框架 给部署到Linux上,于是开始折腾了. 经过重重非人的坑,终于完成了任务: Aries on CentOS7:mvc.a ...

  3. TensorFlow 2.0 Alpha pip安装指令

    TensorFlow 2.0 Alpha目前已经可以通过pip安装,亲测有效,安装指令为: # 普通版本 pip install tensorflow==2.0.0-alpha0 # GPU版本 pi ...

  4. 学习EtherCAT的感想

    第一次进入到自动化领域,接触的第一个项目就是EtherCAT的测试.初次接触以太网,有一点茫然,百度看了很多关于EtherCAT的介绍,看了一些相关的论文.EtherCAT的资料很多:ETG1000. ...

  5. 2019-中小型公司PHP面试题目记录(附带答案)

    博主是三线省会城市的苦逼技术开发,主攻PHP方向,平时前后端语言也都有涉及,因为都是自学,上手就是框架,工作五年来基础补的不稳,换工作的时候苦不堪言,感觉一上来就问Ngnix的运行机制,php的被编译 ...

  6. Python学习之路——Day01

    Day01 一.编程和编程语言 编程语言是人与计算机之间交流沟通的介质 编程就是人实现通过让计算机实现动作的文件 二.计算机的组成 1.控制器:负责控制指挥计算机硬件运行 2.运算器:负责数学与逻辑运 ...

  7. ViewPagerWithRecyclerDemo【RecyclerView+ViewPager实现类似TabLayout+ViewPager效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用RecyclerView+ViewPager实现类似TabLayout+ViewPager效果. 效果图 使用步骤 一.项目组织 ...

  8. 一篇不一样的docker原理解析

    转自:https://zhuanlan.zhihu.com/p/22382728 https://zhuanlan.zhihu.com/p/22403015 在学习docker的过程中,我发现目前do ...

  9. 4.2WebHost配置「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. WebHost配置 覆盖配置文件和修改启动URL 覆盖配置文件和修改启动URL是经常使用的地方,覆盖配置文件可以自 ...

  10. VUE v-for问题

    今天写一个拖动然后使装备交换的功能,在背包格子里 发现直接设置Bags数组的项,v-for渲染出来的列表不会对应改变,只有设置值才会改变 有点拗口,贴代码吧 var repear = this.Bag ...