从.Net到Java学习系列目录

图片上传

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文件上传和下载的更多相关文章

  1. Spring框架学习笔记(7)——Spring Boot 实现上传和下载

    最近忙着都没时间写博客了,做了个项目,实现了下载功能,没用到上传,写这篇文章也是顺便参考学习了如何实现上传,上传和下载做一篇笔记吧 下载 主要有下面的两种方式: 通过ResponseEntity实现 ...

  2. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  3. java框架篇---struts之文件上传和下载

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  4. JavaWeb学习记录(二十三)——文件上传与下载

    一.导入jar包

  5. 从.Net到Java学习第四篇——spring boot+redis

    从.Net到Java学习系列目录 “学习java已经十天,有时也怀念当初.net的经典,让这语言将你我相连,怀念你......”接上一篇,本篇使用到的框架redis.FastJSON. 环境准备 安装 ...

  6. 从.Net到Java学习第三篇——spring boot+mybatis+mysql

    从.Net到Java学习第一篇——开篇 环境:mysql5.7 新建mysql数据库demo,然后执行如下sql脚本进行数据表创建和数据初始化: -- ------------------------ ...

  7. 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2

    从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...

  8. Python3学习笔记(十八):文件上传和下载

    文件上传 以人人网上传头像为例,用Fiddler抓取的上传头像接口报文如下 上传头像图片代码: import requests upload_url = 'http://upload.renren.c ...

  9. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

随机推荐

  1. 算法与数据结构(八) AOV网的关键路径(Swift版)

    上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...

  2. MySQL InnoDB 备份与恢复七种方式

    有几种方式: 1 mysqldump, 这种方式不仅适用于InnoDB,还适用于其它类型的存储引擎,如MyISAM.备份的时候将数据库备份成SQL(包含drop,create,insert等语句),恢 ...

  3. [Swift]LeetCode46. 全排列 | Permutations

    Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...

  4. [Swift]LeetCode353. 设计贪吃蛇游戏 $ Design Snake Game

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  5. 开发常用的 Android 函数库

    第三方函数库(译者注:包括第三方提供的 SDK,开源函数库)以惊人的方式助力着 Android 开发,借助这些其他开发人员辛勤工作的成果,我们开发起来更轻松和快捷.目前存在成千上万的函数库,如何选择正 ...

  6. Feign源码解析系列-核心初始化

    开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么. 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@FeignClient, ...

  7. MVC中的下载文件及上传

    前言:最近做的项目中用到了文件下载与上传,一下子想不起来,只能进行百度,为了方便自己做了一个小demo,特此写了这篇小笔记 1.页面方面: 2.控制器方面 namespace MvcUpload.Co ...

  8. Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据

    写在前面 今天要抓取的网站为 https://500px.me/ ,这是一个摄影社区,在一个摄影社区里面本来应该爬取的是图片信息,可是我发现好像也没啥有意思的,忽然觉得爬取一下这个网站的摄影师更好玩一 ...

  9. ConcurrentModificationException 异常处理

    在工作中碰到有个异常:java.util.ConcurrentModificationException 腾讯bugly工具给出的解决方案和说明如下:该异常表示迭代器迭代过程中,迭代的对象发生了改变, ...

  10. php_D3_“简易聊天室 ”实现的关键技术 详解

                      PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可 ...