一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

这篇具有很好参考价值的文章主要介绍了一张图带你学会入门级别的SpringBoot实现文件上传、下载功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:SpringBoot实战


系列文章目录

标题
一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)
一张思维导图带你学会Springboot创建全局异常、自定义异常
一张思维导图带你打通SpringBoot自定义拦截器的思路
28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存
一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端


思维导图

一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端

🌟前言

在开发系统过程中,往往离不开系统文件上传于下载的功能,本篇文章就对SpringBoot实现文件上传与下载功能作出演示。

🌟要点准备

MultipartFile是Spring框架提供的一个接口,用于处理文件上传的请求。它封装了上传的文件内容、文件名、大小等信息,并提供了一些常用的方法来操作文件。下表是常用的API

方法 描述
String getOriginalFilename() 获取上传文件的原始文件名
String getName() 获取文件域的名称
String getContentType() 获取上传文件的内容类型
boolean isEmpty() 判断上传的文件是否为空
long getSize() 获取上传文件的大小,单位为字节
byte[] getBytes() 将上传文件的内容以字节数组形式返回
InputStream getInputStream() 获取上传文件的输入流,可以用于读取文件内容
void transferTo(File dest) 将上传文件保存到指定的目标文件

🌟实现步骤

功能概述:实现文件上传功能并保存到数据库表file中,以及文件下载功能。
实现思路:

  1. 客户端通过发送上传请求到 Spring Boot 服务器,服务器返回一个上传页面供用户选择文件。
  2. 用户选择并上传文件,服务器获取文件信息(文件名称、文件路径、文件大小、文件类型)。
  3. 服务器将文件保存到指定的存储设备中。
  4. 存储设备将文件保存成功后,服务器将文件信息保存到数据库。
  5. 服务器返回上传成功消息给客户端。
  6. 客户端发起下载请求,服务器根据文件ID查询文件信息。
  7. 服务器从数据库中获取文件信息。
  8. 服务器根据文件路径从存储设备中获取文件。
  9. 服务器构建文件资源,并将其返回给客户端。
  10. 客户端请求下载指定文件,服务器根据文件路径从存储设备中获取文件。
  11. 服务器设置响应头信息,并构建响应体返回给客户端。

数据表准备

创建数据库表file

  • id:主键ID
  • file_name:文件名称
  • file_path:文件路径
  • file_type:文件类型
  • file_size:文件大小
CREATE TABLE `file`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_size` bigint(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

File实体类

创建File实体类,并生成getter和setter方法。这里我做出了省略。

public class File implements Serializable {
    private Integer id;
    private String fileName;
    private String filePath;
    private Integer fileSize;
    private String fileType;
    //省略getter,setter
}

配置文件保存目录

file.upload-path = E:/upload

FileController编写

注意一定要将文件保存到本地路径后,再进行数据库信息的保存!本上传方法较为简单,非常适合入门级别查看。

@RestController
@RequestMapping("/api/v1/file")
public class FileController {
    @Autowired
    private FileService fileService;
    @Value("${file.upload-path}")
    private String uploadPath;
    //上传功能
    @GetMapping("upload")
    public JsonData uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        //获取文件上传名称
        String fileName=file.getOriginalFilename();
        //获取文件保存全路径
        String savePath=uploadPath+"/"+fileName;
        //获取文件大小
        Long fileSize=file.getSize();
        //获取文件类型
        String fileType=file.getContentType();
        java.io.File newFile=new java.io.File(savePath);
        //TODO 注意要将文件保存到本地路径中
        file.transferTo(newFile);
        File saveFile=new File();
        saveFile.setFileName(fileName);
        saveFile.setFileSize(fileSize);
        saveFile.setFileType(fileType);
        saveFile.setFilePath(savePath);
        fileService.saveFile(saveFile);
        return JsonData.buildSuccess();
    }
}
//文件下载
@GetMapping("down")
    public ResponseEntity downFile(@RequestParam Integer id) throws MalformedURLException, UnsupportedEncodingException {
        //首先根据id,从数据库获取文件信息
        File downFile=fileService.selectFileById(id);
        if (downFile!=null){
            String path= downFile.getFilePath();
            //本地路径地址转为url编码路径
            URI urlPath= Paths.get(path).toUri();
            Resource resource=new UrlResource(urlPath);
            if (resource.exists()){
                HttpHeaders headers=new HttpHeaders();
                headers.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_OCTET_STREAM+"");
                headers.add(HttpHeaders.CONTENT_LENGTH,downFile.getFileSize()+"");
                //注意文件名处要改为URL编码
                headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=\"" +
                        URLEncoder.encode(downFile.getFileName(),"utf-8") + "\"");
                return ResponseEntity.ok().headers(headers).body(resource);
            }
        }
        return ResponseEntity.notFound().build();
    }

🌟最终测试

文件上传

一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端
数据库成功保存并且本地路径也有当前文件
一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端
一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端

文件下载

一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端

🌟写在最后

有关于SpringBoot实现文件上传、下载功能到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


一张图带你学会入门级别的SpringBoot实现文件上传、下载功能,SpringBoot实战,spring boot,java,后端文章来源地址https://www.toymoban.com/news/detail-654720.html

到了这里,关于一张图带你学会入门级别的SpringBoot实现文件上传、下载功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码) 一张思维导图带你学会Springboot创

    2024年02月14日
    浏览(69)
  • 一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 日常开发项目上线或者部署个人博客网站,都离不开线上服务器部署应用。本文带你学会线上部署应用。

    2024年02月14日
    浏览(42)
  • 一张思维导图带你打通SpringBoot自定义拦截器的思路

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 在开发中,都离不开拦截器的使用。比如说在开发登录功能时,采用JWT登录时通过对token进行验证实现登

    2024年02月14日
    浏览(38)
  • 一张图带你看完图论第五章(包含全部考点,含定义、定理、公式、推导证明和所有例题)

    付费大佬可以联系我把你们加入思维导图协作,看更加具体清楚地思维导图/敬礼 5.1 匹配 匹配(边独立集)M是G的不相邻边组成的边子集(无环) 饱和点 v是匹配M中某边的端点,则称v为M饱和点 完美匹配 G中每个顶点均为M饱和点,则M为G的完美匹配 最优匹配 在赋权完全偶图

    2024年02月09日
    浏览(37)
  • Unity一张图带你看懂Button的各种颜色设定(HighLighted、Pressed、Selected、Disabled Color)

    button会有个基础颜色,建议设定为白色,因为这个基础颜色会和后续的颜色产生一个叠加效果。 NormalColor 基础时候的颜色 HighLightedColor 当鼠标放上去时显示的颜色 Pressed Color 当鼠标按下,但是不松开时的颜色, Selected color 当鼠标按下后,选中该按钮的颜色 DisabledColor,当该按

    2024年02月11日
    浏览(45)
  • ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别

    从广义来说,doc values 本质上是一个序列化的 列式存储 。列式存储 适用于聚合、排序、脚本等操作,所有的数字、地理坐标、日期、IP 和不分词( not_analyzed )字符类型都会默认开启, 不支持 text 和 annotated_text 类型 倒排 :即 词项 = 包含当前词项的doc_id的列表 的映射。倒排

    2024年02月02日
    浏览(40)
  • 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 Avue 是 基于vue和element-ui的快速开发框架 。它的核心是数据驱动UI的思想,让我们从繁琐的crud开发中解脱出来,它的写法类似easyUI,

    2024年02月12日
    浏览(30)
  • springboot的缓存和redis缓存,入门级别教程

    一、springboot(如果没有配置)默认使用的是jvm缓存 1、Spring框架支持向应用程序透明地添加缓存。抽象的核心是将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑是透明地应用的,对调用者没有任何干扰。只要使用@EnableCaching注释启用了缓存支持,Spri

    2024年02月07日
    浏览(39)
  • 【Redis从头学 -1】17张图带你学会Redis多环境(Linux、Windows)安装与配置

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Redis从头学 Windows下载地址 Linux下载地址 https://github.com/microsoftarchive/redis/releases https://redis.io/download/ windows下载 linux下载

    2024年02月12日
    浏览(47)
  • 一张图学会python递归函数

    递归函数属于那种“难者不会,会者不难”的事情,回想自己大学时学习递归函数的经历,简直是痛不欲生,代码里没有一行是看不懂的,但就是理解不了它是怎样运行的。 等到自己悟通了原理,就又会觉得这东西太简单了,不明白自己当初为何想不清楚。 对于递归函数,

    2023年04月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包