从.Net到Java学习第十篇——Spring Boot文件上传和下载
图片上传
Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了。
在模板目录创建一个新的页面 profile/uploadPage.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h2 class="indigo-text center">Upload</h2>
<form th:action="@{/upload}" method="post" enctype="multipart/form-data" class="col m8 s12 offset-m2">
<div class="input-field col s6">
<input type="file" id="file" name="file"/>
</div>
<div class="col s6 center">
<button class="btn indigo waves-effect waves-light"
type="submit" name="save" >Submit
<i class="mdi-content-send right"></i>
</button>
</div>
<div class="col s12 center red-text" th:text="${error}" th:if="${error}">
Error during upload
</div>
<div class="col m8 s12 offset-m2">
<img th:src="@{${picturePath}}" width="100" height="100"/>
</div>
</form>
</body>
</html>
除了表单中的 enctype 属性以外,并没有太多值得关注的。文件将会通过 POST 方法发送到 upload URL 上,新建控制器PictureUploadController
@Controller
@SessionAttributes("picturePath")
public class PictureUploadController {
//跳转到上传文件的页面
@RequestMapping("upload")
public String uploadPage() {
return "profile/uploadPage";
}
//处理文件上传
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String onUpload(MultipartFile file, HttpServletRequest request, RedirectAttributes redirectAttrs, Model model) throws IOException {
if (file.isEmpty() || !isImage(file)) {
redirectAttrs.addFlashAttribute("error", "Incorrect file.Please upload a picture.");
return "redirect:/upload";
}
String filePath = request.getSession().getServletContext().getRealPath("pictures/");
Resource picturePath = copyFileToPictures(file,filePath);
String _path="/pictures/"+picturePath.getFilename();
model.addAttribute("picturePath",_path);
return "profile/uploadPage";
} private Resource copyFileToPictures(MultipartFile file,String filePath) throws IOException {
String filename = file.getOriginalFilename();
File tempFile = File.createTempFile("pic",
getFileExtension(filename), new FileSystemResource(filePath).getFile());
try (InputStream in = file.getInputStream();
OutputStream out = new FileOutputStream(tempFile)) {
IOUtils.copy(in, out);
}
return new FileSystemResource(tempFile);
} //判断上传文件的类型是否是图片
private boolean isImage(MultipartFile file) {
return file.getContentType().startsWith("image");
}
//获取上传文件的扩展名
private static String getFileExtension(String name) {
return name.substring(name.lastIndexOf("."));
}
}
在项目的根目录下创建 pictures 目录 ,上述代码做的第一件事情是在 pictures 目录下创建一个临时文件,这个目录位于项目的根文件夹下,所以要确保该目录是存在的。在 Java 中,临时文件只是用来获取文件系统中唯一的文件标识符的,用户可以自行决定是否要删除它 。用户提交的文件将会以 MultipartFile 接口的形式注入到控制器中,这个接口提供了多个方法,用来获取文件的名称、大小及其内容 。try...with 代码块将会自动关闭流,即便出现异常也会如此,从而移除了finally 这样的样板式代码 。我们还可以定义上传文件的功能。
- multipart.maxFileSize:这定义了所允许上传文件的最大容量。尝试上传更大的文件将会出现 MultipartException,其默认值是 1Mb;
- multipart.maxRequestSize:这定义了整个 multipart 请求的最大容量,默认值是 10MB。

运行预览:

图片下载
修改控制器PictureUploadController,添加如下代码:
//图片下载
@RequestMapping(value = "/DownloadPic", method = RequestMethod.GET)
public void Download(HttpServletRequest req,HttpServletResponse res) {
String fileName = "pic2456280610589533697.jpg";
res.setHeader("content-type", "application/octet-stream");
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = res.getOutputStream();
String filePath = req.getSession().getServletContext().getRealPath("pictures/");
bis = new BufferedInputStream(new FileInputStream(new File(filePath + fileName)));
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("success");
}
修改uploadPage.html,添加:
<a href="/DownloadPic">下载图片</a>

从.Net到Java学习第十篇——Spring Boot文件上传和下载的更多相关文章
- Spring框架学习笔记(7)——Spring Boot 实现上传和下载
最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
- java框架篇---struts之文件上传和下载
Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...
- JavaWeb学习记录(二十三)——文件上传与下载
一.导入jar包
- 从.Net到Java学习第四篇——spring boot+redis
从.Net到Java学习系列目录 “学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis.FastJSON. 环境准备 安装 ...
- 从.Net到Java学习第三篇——spring boot+mybatis+mysql
从.Net到Java学习第一篇——开篇 环境:mysql5.7 新建mysql数据库demo,然后执行如下sql脚本进行数据表创建和数据初始化: -- ------------------------ ...
- 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2
从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...
- Python3学习笔记(十八):文件上传和下载
文件上传 以人人网上传头像为例,用Fiddler抓取的上传头像接口报文如下 上传头像图片代码: import requests upload_url = 'http://upload.renren.c ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- .NET Core的依赖注入[1]: 控制反转
写在前面:我之前写过一系列关于.NET Core依赖注入的文章,由于.NET Core依赖注入框架的实现原理发生了很大的改变,加上我对包括IoC和DI这些理论层面的东西又有了一些新的理解,所以我在此基 ...
- SDL 开发实战(五): SDL 纹理渲染
本文我们讲一下如何使用SDL_Texture将视频纹理渲染出来. 1. SDL 视频渲染相关对象 SDL 视频渲染主要涉及到四个对象:SDL_Window.SDL_Render.SDL_Texture ...
- [Swift]LeetCode128. 最长连续序列 | Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Y ...
- [Swift]LeetCode212. 单词搜索 II | Word Search II
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...
- [Swift]LeetCode706. 设计哈希映射 | Design HashMap
Design a HashMap without using any built-in hash table libraries. To be specific, your design should ...
- LongAdder 测试
import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.util.concurrent.CountDownLatch;i ...
- BBS论坛(一)
1.1.项目结构搭建 (1)创建flask项目Perfect_bbs,然后搭建项目结构如下: (2)构建蓝图 cms/views.py # cmd/views.py from flask import ...
- wget Mac OS 下安装
wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...
- 【java设计模式】(4)---工厂模式(案例解析)
设计模式之工厂模式 工厂模式分三种:简单工厂模式(也叫静态工厂模式),工厂方法模式(也叫多形性工厂),抽象工厂模式(也叫工具箱)下面会一一举例. 一.概念 1.什么是工厂模式 这种类型的设计模式属于创 ...
- Vim 复制粘帖格式错乱问题的解决办法
有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题.看样子,应该是自动缩进惹得祸.本文不去深究原因,直接给出解决方法. 1. paste 模式 运行如下命令,进入 paste 模式: :s ...