SpringBoot学习:文件上传和下载
maven导入依赖
首先创建一个maven项目,然后加入以下配置,就创建好了一个springboot项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
项目
主要是实现文件的上传和下载,所以项目结构很简单

先看一下配置文件,SpringBoot提供了文件解析类,我们需要去配置一些参数
主要是限制上传文件的大小

然后是上传文件的工具类,这里是自己写的文件操作,(使用commons-fileupload和commons-io这些写好的工具更好)
package com.david.learn.utlis; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder; public class FileUtils { /**
*
* @param input 输入的文件流
* @param filePath 文件要保存的路径
* @throws IOException
*/
public static void upload(InputStream input, File filePath) throws IOException {
FileOutputStream output = new FileOutputStream(filePath); byte[] bytes = new byte[4096];
int n ;
while (-1 != (n = input.read(bytes)) ) {
output.write(bytes,0,n);
}
} /**
* 将文件下载到客户端
*
* @param filePath
* @param fileName
* @param response
* @param isOnLine 是否在线打开
* @throws Exception
*/
public static void download(String filePath, String fileName, HttpServletRequest request,
HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath); BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0; response.reset(); // 非常重要
// 解决文件名中文乱码问题
String fileNameDisplay = URLEncoder.encode(fileName, "UTF-8");
// 针对火狐浏览器需要特殊处理
if ("FF".equals(getBrowser(request))) {
fileNameDisplay = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
// 在线打开方式
if (isOnLine) {
response.setHeader("Content-Disposition", "inline; filename=" + fileNameDisplay);
}
// 纯下载方式
else {
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + fileNameDisplay);
} OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
br.close();
out.close();
} /**
* 判断客户端浏览器类型
*
* @param request
* @return
*/
private static String getBrowser(HttpServletRequest request) {
String UserAgent = request.getHeader("USER-AGENT").toLowerCase();
if (UserAgent != null) {
if (UserAgent.indexOf("msie") >= 0) {
return "IE";
}
if (UserAgent.indexOf("firefox") >= 0) {
return "FF";
}
if (UserAgent.indexOf("safari") >= 0) {
return "SF";
}
}
return null;
}
}
在写controller代码之前,还需要写一个接口调用后返回的响应类
package com.david.learn.dto; import lombok.AllArgsConstructor;
import lombok.Data; @Data
@AllArgsConstructor
public class BaseReturnDto {
// 返回码
private int code;
// 结果说明
private String msg;
}
最后是controller的代码,总共写了三个接口,分别是上传文件、下载文件、在线查看文件
- 查看文件还得看浏览器是否支持,一般查看pdf文件是可以的
package com.david.learn.controller; import com.david.learn.dto.BaseReturnDto;
import com.david.learn.utlis.FileUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException; @RestController
public class FileOperateController {
// 当前项目绝对路径
private static final String PROJECT_PATH = new File("").getAbsolutePath();
// 文件上传的路径
private static final String UPLOAD_PATH = PROJECT_PATH + "/upload/"; // 最好手动在项目里创建文件夹,如果不想手动创建,加上这段代码
static {
// 项目里没有upload这个文件夹时,会自动创建
File file = new File(UPLOAD_PATH);
if (!file.exists()){
if (!file.mkdirs()) {
throw new RuntimeException("创建文件夹失败");
}
}
} /**
* 文件上传
*/
@PostMapping("/uploadFile")
// 使用数组可以实现多文件上传,单文件的话不用数组
public BaseReturnDto uploadFile(MultipartFile[] multipartFile) throws IOException { for (MultipartFile file : multipartFile) {
String fileLocation = UPLOAD_PATH + file.getOriginalFilename(); FileUtils.upload(file.getInputStream(), new File(fileLocation));
} return new BaseReturnDto(200, "文件上传成功");
} /**
* 文件下载
*/
@GetMapping("/downloadFile/fileName/{fileName}")
public BaseReturnDto download(HttpServletRequest request, HttpServletResponse response, @PathVariable String fileName) { try {
FileUtils.download(UPLOAD_PATH + fileName, fileName, request, response, false);
return new BaseReturnDto(200, "文件下载成功");
} catch (Exception e) {
e.printStackTrace();
return new BaseReturnDto(500, "文件下载失败");
}
} /**
* 在线查看文件
*/
@GetMapping("/watchFile/fileName/{fileName}")
public BaseReturnDto watch(HttpServletRequest request, HttpServletResponse response, @PathVariable String fileName) { try {
FileUtils.download(UPLOAD_PATH + fileName, fileName, request, response, true);
return new BaseReturnDto(200, "文件查看成功");
} catch (Exception e) {
e.printStackTrace();
return new BaseReturnDto(500, "文件查看失败");
}
} }
测试接口
使用postman测试接口,结果完美

SpringBoot学习:文件上传和下载的更多相关文章
- springboot+web文件上传和下载
一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- 七、springBoot 简单优雅是实现文件上传和下载
前言 好久没有更新spring Boot 这个项目了.最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来.刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架 ...
- SpringBoot图文教程4—SpringBoot 实现文件上传下载
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
- Java Web 学习(8) —— Spring MVC 之文件上传与下载
Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...
- 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载
输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (209)-- 算法导论15.4 6题
六.设计一个 O(nlgn) 时间的算法,求一个 n 个数的序列的最长单调递增子序列.(提示:注意到,一个长度为 i 的候选子序列的尾元素至少不比一个长度为 i-1 候选子序列的尾元素小.因此,可以在 ...
- zabbix“专家坐诊”第178期问答汇总
大家好,我是乐乐.早在三年前,我们就在社区举办了zabbix公益问答活动,并且定在每周三邀请资深的zabbix技术工程师,为社群的小伙伴进行免费的答疑.到现在已经178期了.后续我将会把每期的答疑汇总 ...
- 摆脱鼠标系列 - vscode - ctrl+up 光标上移动4行 ctrl+down 光标下移4行
为什么 摆脱鼠标系列 - vscode - ctrl+up 光标上移动4行 之前滚动屏幕总是用鼠标,现在改为 ctrl + 上箭头或下箭头 实现起来稍微有些麻烦 实现 需要安装 macros 插件 这 ...
- Prettier 和 ESLint 冲突解决方案 eslint-config-prettier eslint-plugin-prettier
划重点 eslint-config-prettier 禁用 eslint 冲突配置 eslint-plugin-prettier Prettier先格式化 (默认是先eslint格式化,再Pretti ...
- SpringBoot单次执行任务,退出异常NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
背景 使用SpringBoot 运行一次性作业,用于初始化 问题:直接使用System.exit退出时,遇到异常:NoClassDefFoundError: ch/qos/logback/classi ...
- 【转】客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析
原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...
- 展会回顾 | 2023元宇宙生态博览会圆满落幕,3DCAT荣获“元宇宙交互技术奖”
2023年5月10日-5月12日,一场涵盖了元宇宙终端头显.数字文娱.数字艺术.数字运动.数字多媒体展陈设计.数字展厅展馆.科技文旅.夜游演艺.沉浸式KTV/酒吧等多个领域的元宇宙商业盛会--2023 ...
- demo介绍:uni-app统合--各类大转盘demo介绍
这里给大家介绍下我做的一个uni-app的demo:抽奖系统 废话不多说直接上效果图: 线上案例: 首页: 大转盘抽奖页面: 轮播机抽奖页面: 九宫格抽奖页面: 翻牌抽奖页面: 奖品列表页面: 抽奖的 ...
- 记录--vue刷新当前页面
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面. 思路 (1)如果页面简单,调用接口刷新数据即可. ...
- 二.安装ifconfig命令
二.安装ifconfig命令 1.ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等 ...