一起来学SpringBoot | 第十七篇:轻松搞定文件上传     

``` ### 控制层 创建一个`FileUploadController`,其中`@GetMapping`的方法用来跳转`index.html`页面,而`@PostMapping`相关方法则是对应的 **`单文件上传`、`多文件上传`、`BASE64编码`** 三种处理方式。 **`@RequestParam("file")` 此处的`"file"`对应的就是`html 中 name="file" 的 input 标签`,而将文件真正写入的还是借助的`commons-io`中的`FileUtils.copyInputStreamToFile(inputStream,file)`** ``` java package com.battcn.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.util.Base64Utils; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 图片上传的几种方式 * * @author Levin * @since 2018/5/31 0031 */ @Controller @RequestMapping("/uploads") public class FileUploadController { private static final Logger log = LoggerFactory.getLogger(FileUploadController.class); @GetMapping public String index() { return "index"; } @PostMapping("/upload1") @ResponseBody public Map upload1(@RequestParam("file") MultipartFile file) throws IOException { log.info("[文件类型] - [{}]", file.getContentType()); log.info("[文件名称] - [{}]", file.getOriginalFilename()); log.info("[文件大小] - [{}]", file.getSize()); // TODO 将文件写入到指定目录(具体开发中有可能是将文件写入到云存储/或者指定目录通过 Nginx 进行 gzip 压缩和反向代理,此处只是为了演示故将地址写成本地电脑指定目录) file.transferTo(new File("F:\\app\\chapter16\\" + file.getOriginalFilename())); Map result = new HashMap<>(16); result.put("contentType", file.getContentType()); result.put("fileName", file.getOriginalFilename()); result.put("fileSize", file.getSize() + ""); return result; } @PostMapping("/upload2") @ResponseBody public List> upload2(@RequestParam("file") MultipartFile[] files) throws IOException { if (files == null || files.length == 0) { return null; } List> results = new ArrayList<>(); for (MultipartFile file : files) { // TODO Spring Mvc 提供的写入方式 file.transferTo(new File("F:\\app\\chapter16\\" + file.getOriginalFilename())); Map map = new HashMap<>(16); map.put("contentType", file.getContentType()); map.put("fileName", file.getOriginalFilename()); map.put("fileSize", file.getSize() + ""); results.add(map); } return results; } @PostMapping("/upload3") @ResponseBody public void upload2(String base64) throws IOException { // TODO BASE64 方式的 格式和名字需要自己控制(如 png 图片编码后前缀就会是 data:image/png;base64,) final File tempFile = new File("F:\\app\\chapter16\\test.jpg"); // TODO 防止有的传了 data:image/png;base64, 有的没传的情况 String[] d = base64.split("base64,"); final byte[] bytes = Base64Utils.decodeFromString(d.length > 1 ? d[1] : d[0]); FileCopyUtils.copy(bytes, tempFile); } } ``` ### 主函数 ``` java package com.battcn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Levin */ @SpringBootApplication public class Chapter16Application { public static void main(String[] args) { SpringApplication.run(Chapter16Application.class, args); } } ``` ### 测试 完成准备事项后,启动`Chapter16Application`,访问 [http://localhost:8080/uploads](http://localhost:8080/uploads) 进入到文件上传页面。**`单文件上传`、`多文件上传`** 都是及其简单的就不做演示了,相信各位自己也是可以完成的。 ![文件上传页](http://image.battcn.com/article/images/20180531/springboot/v2-other-upload/1.png) > BASE64 测试方法 打开浏览器访问 [http://base64.xpcha.com/pic.html](http://base64.xpcha.com/pic.html) 选择一张图片将其转换为`base64`编码的,随后将转换后的`base64字符串内容` 复制到下图中的文本框中,点击上传即可,随后到指定目录下就可以看到我们上传的文件了 ![BASE64上传](http://image.battcn.com/article/images/20180531/springboot/v2-other-upload/2.png) ## 总结 目前很多大佬都写过关于 **`SpringBoot`** 的教程了,如有雷同,请多多包涵,本教程基于最新的 `spring-boot-starter-parent:2.0.2.RELEASE`编写,包括新版本的特性都会一起介绍... ## 说点什么 - **个人QQ:1837307557** - **battcn开源群(适合新手):391619659** - **微信公众号(欢迎调戏):`battcn`** ![公众号](http://image.battcn.com/assets/images/wxgzh8cm.png) 个人博客:[http://blog.battcn.com/](http://blog.battcn.com/ "http://blog.battcn.com/") 全文代码:[https://github.com/battcn/spring-boot2-learning/tree/master/chapter16](https://github.com/battcn/spring-boot2-learning/tree/master/chapter16 "https://github.com/battcn/spring-boot2-learning/tree/master/chapter16")