Spring Boot 文件上传简易教程
上传文件是我们日常使用最为广泛的功能之一,比如App端上传头像。本章演示如何从客户端上传到 Spring Boot 开发的 Api中。
1 新建 Spring Boot Maven 示例工程项目
注意:本示例是用 IDEA 开发工具
- File > New > Project,如下图选择 Spring Initializr然后点击 【Next】下一步
- 填写 GroupId(包名)、Artifact(项目名) 即可。点击 下一步
 groupId=com.fishpro
 artifactId=upload
- 选择依赖 Spring Web Starter前面打钩。
- 项目名设置为 spring-boot-study-upload.
文件上传不需要引入第三方组件。
2 依赖引入 Pom.xml
为了演示代码,这里引入 thymeleaf
<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>
3 编写上传示例
本章代码主要演示单文件上传和多文件上传,前端采用 thymeleaf 模板,实际上就是一个html文件。文件清单包括
- uploadfile.html 前端文件
- FileController.java 控制层文件
- FileUtil.java 文件常用类
3.1 控制层代码
主要使用 MultipartFile 来实现,如下代码 /upload 和 /uploads 分别为单文件上传和多文件上传。其中 @Value("${fishpro.uploadPath}") 是配置文件中设置的。
server.port=8086
fishpro.uploadPath=/Users/jiaojunkang/Desktop/upload/
@Controller
public class FileController {
    @Value("${fishpro.uploadPath}")
    private String uploadPath;
    @GetMapping("/uploadfile")
    public String uploadfile(){
        return "uploadfile";
    }
    /**
     * 单文件
     * */
    @PostMapping("/upload")
    @ResponseBody
    Object upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        Map<String,Object> map=new HashMap();
        map.put("status",0);
        String fileName = file.getOriginalFilename();
        fileName = UUID.randomUUID().toString(); //对文件名称重命名
        try {
            FileUtil.uploadFile(file.getBytes(), uploadPath, fileName);
            map.put("filename",fileName);
        } catch (Exception e) {
           map.put("status",-1);
           map.put("message",e.getMessage());
        }
        return map;
    }
    /**
     * 多文件
     * */
    @PostMapping("/uploads")
    @ResponseBody
    Object uploads(@RequestParam("files") MultipartFile [] files, HttpServletRequest request) {
        Map<String,Object> map=new HashMap();
        map.put("status",0);
        List<String> filenames=new ArrayList<>();
        for (MultipartFile file: files
             ) {
            String ext = file.getOriginalFilename().split("\\.")[1];
            String fileName = file.getOriginalFilename();
            //fileName = UUID.randomUUID().toString()+"."+ext; //对文件名称重命名
            try {
                FileUtil.uploadFile(file.getBytes(), uploadPath, fileName);
                filenames.add(fileName);
            } catch (Exception e) {
                map.put("status",-1);
                map.put("message",e.getMessage());
                return  map;
            }
        }
        map.put("filename",filenames);
        return map;
    }
}
3.2 前端文件
前端文件这里演示的比较简单,可以有多中形态,这里使用 form 来提交。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<hr/>
<div>单位文件</div>
<form enctype="multipart/form-data" method="post" action="/upload">
    文件 <input type="file" name="file"/>
    <input type="submit" value="上传"/>
</form>
<hr/>
<div>多文件</div>
<form enctype="multipart/form-data" method="post" action="/uploads">
    <p>文件1<input type="file" name="files"/></p>
    <p>文件2<input type="file" name="files"/></p>
    <p>文件3<input type="file" name="files"/></p>
    <p><input type="submit" value="上传"/></p>
</form>
</body>
</html>
3.3 文件保存类
public class FileUtil {
    public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
        File targetFile = new File(filePath);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        FileOutputStream out = new FileOutputStream(filePath + fileName);
        out.write(file);
        out.flush();
        out.close();
    }
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    public static String renameToUUID(String fileName) {
        return UUID.randomUUID() + "." + fileName.substring(fileName.lastIndexOf(".") + 1);
    }
}
Spring Boot 文件上传简易教程的更多相关文章
- spring boot文件上传、下载
		主题:Spring boot 文件上传(多文件上传)[从零开始学Spring Boot]http://www.iteye.com/topic/1143595 Spring MVC实现文件下载http: ... 
- Spring Boot 文件上传原理
		首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ... 
- Spring Boot 文件上传
		其实网上已经有很多这样的文章了.为什么我还要记录一下呢?原因是在工作中对接外系统时,碰到了他们调取我们文件上传接口确存在着http请求头部规范的情况,从而导致用传统方法获取不到参数.今天就来整理下Sp ... 
- spring boot 文件上传大小限制
		错误信息 : Spring Boot:The field file exceeds its maximum permitted size of 1048576 bytes. 解决方法一:在启动类添加如 ... 
- 从.Net到Java学习第十篇——Spring Boot文件上传和下载
		从.Net到Java学习系列目录 图片上传 Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了. 在模板目录创建一个新的页面 profile/uploadPage. ... 
- Spring Boot 文件上传与下载
		原文地址: https://www.cnblogs.com/studyDetail/p/7003253.html 1.在pom.xml文件中添加依赖 <project xmlns="h ... 
- (29)Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】
		文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个表单页面(这里使用thymleaf); (4)编写controlle ... 
- spring boot 文件上传工具类(bug 已修改)
		以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ... 
- Spring Boot文件上传
		一.创建一个简单的包含WEB依赖的SpringBoot项目 二.配置文件上传的文件大小限制 # 上传文件总的最大值spring.servlet.multipart.max-request-size=1 ... 
随机推荐
- 巨杉Talk | 拒绝数据碎片化,原生分布式数据库灵活应对数据管理需求
			2019年7月19-20日,以“运筹帷幄,数揽未来”为主题的DAMS中国数据智能管理峰会在上海青浦区成功举办.在DAMS峰会上,巨杉数据库为大家带来了题为“云架构下的分布式数据库设计与实践”的主题分享 ... 
- 浏览器缓存信息(Autocomplete )
			Autocomplete HTML Attribute Not Disabled for Password Field 漏洞详细Web系统被识别到支持自动完成功能,这样通过浏览器可以获取到敏感信息. ... 
- batchsize用法 以及实现前向运算的矩阵乘法方式
			batchsize用法 以及实现前向运算的矩阵乘法方式 待办 使用batchsize可以把矩阵缩小,采用矩阵乘法的形式可以一次计算多个经过神经网络的结果,然后通过交叉熵进行计算总的损失得到结果. 所以 ... 
- Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099
			方法:把catalina.bat 文件中set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m这行去掉,具体看下面两篇博客 https://blo ... 
- pytest学习5-mark用例分类
			使用Mark标记测试用例 通过使用pytest.mark你可以轻松地在测试用例上设置元数据.例如, 一些常用的内置标记: skip - 始终跳过该测试用例 skipif - 遇到特定情况跳过该测试用例 ... 
- SQL语句性能分析
			SQL语句性能分析 explain执行计划 用法: explain select 语句 命令: show database; use mysql explain select * from user; ... 
- ORA-01935: missing user or role name
			问题描述 ORA-01935: missing user or role name ORA-01935:缺少用户或角色名 
- js模板引擎mustache介绍及实例
			在Javascript中 mustache.js是实现mustache模板系统. Mustache是一种没有逻辑的模板语法.它可以应用于HTML.配置文件.源代码等任何地方. 它通过使用散列或对象中提 ... 
- 174. 地下城游戏(逆向DP)
			Q: 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士 ... 
- 在EF中使用原生SQL,首先要创建上下文对象
			using (var db = new Entities()) { //数据操作 } 新增 string sql = "insert into UserInfo values('zhangs ... 
