使用SpringBoot优雅的实现文件上传

这篇具有很好参考价值的文章主要介绍了使用SpringBoot优雅的实现文件上传。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文件上传

一、文件上传介绍

文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。

服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件:

  • commons-fileupload
  • commons-io

Spring框架在spring-web包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接收上传的文件,例如:
springboot上传文件,SpringBoot,spring boot,java,后端

二、 文件上传代码实现

1. 编写数据表 file

Sql:

CREATE TABLE `sys_file` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件名称',
  `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件类型',
  `size` bigint(20) DEFAULT NULL COMMENT '文件大小(kb)',
  `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '下载链接',
  `md5` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件md5',
  `is_delete` tinyint(1) DEFAULT '0' COMMENT '是否删除',
  `enable` tinyint(1) DEFAULT '1' COMMENT '是否禁用链接',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

表结构:
springboot上传文件,SpringBoot,spring boot,java,后端

其中is_delete和enable的默认值分别是0和1

2. 后端代码编写

文件上传的代码逻辑
springboot上传文件,SpringBoot,spring boot,java,后端

增加一个控制层类FileController.java:

springboot上传文件,SpringBoot,spring boot,java,后端

在配置文件application.yml添加文件上传到的位置:

files:
  upload:
    path: F:/后台管理系统/files/

文件磁盘路径:

springboot上传文件,SpringBoot,spring boot,java,后端

2.1 文件上传代码一
/**
 * @author hj
 */
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {
	//文件磁盘路径
    @Value("${files.upload.path}")
    private String fileUploadPath;

    @PostMapping("/upload")
    public Result upload(@RequestParam MultipartFile file) throws IOException {
        //获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        //获取文件的类型
        String type = FileUtil.extName(originalFilename);
        log.info("文件类型是:" + type);
        //获取文件大小
        long size = file.getSize();

        //获取文件
        File uploadParentFile = new File(fileUploadPath);
        //判断文件目录是否存在
        if(!uploadParentFile.exists()) {
            //如果不存在就创建文件夹
            uploadParentFile.mkdirs();
        }
        //定义一个文件唯一标识码(UUID)
        String uuid = UUID.randomUUID().toString();

        File uploadFile = new File(fileUploadPath + uuid + StrUtil.DOT + type);
        //将临时文件转存到指定磁盘位置
        file.transferTo(uploadFile);
            
        return Result.success("");
    }
}

2.1.1 关键代码

1. 将临时文件转存到指定位置

//将临时文件转存到指定位置
file.transferTo(new File(basePath + fileName));

2. 注意:文件后缀(类型)要加上

//获取文件的类型
String type = FileUtil.extName(originalFilename);
log.info("文件类型是:" + type);

StrUtil.DOT表示"."

2.1.2 补充

FileUtil类是一个工具类,需要配置hutool包的依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.20</version>
</dependency>
2.1.3 测试

我们现在apifox里面进行测试

springboot上传文件,SpringBoot,spring boot,java,后端
springboot上传文件,SpringBoot,spring boot,java,后端

文件已经创建:
springboot上传文件,SpringBoot,spring boot,java,后端

2.2 文件上传代码二(存储至数据库)
2.2.1 编写实体类File.java
@Getter
@Setter
@TableName("sys_file")
@ApiModel(value = "File对象", description = "")
public class File implements Serializable {

    private static final long serialVersionUID = 1L;

      @ApiModelProperty("id")
        @TableId(value = "id", type = IdType.AUTO)
      private Integer id;

      @ApiModelProperty("文件名称")
      private String name;

      @ApiModelProperty("文件类型")
      private String type;

      @ApiModelProperty("文件大小")
      private Long size;

      @ApiModelProperty("下载链接")
      private String url;

      @ApiModelProperty("是否删除")
      private Boolean isDelete;

      @ApiModelProperty("是否禁用链接")
      private Boolean enable;
      
}
2.2.2 FileController.java
/**
 * 文件上传接口
 * @param file
 * @return
 * @throws IOException
 */
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IOException {
    //获取文件原始名称
    String originalFilename = file.getOriginalFilename();
    //获取文件的类型
    String type = FileUtil.extName(originalFilename);
    log.info("文件类型是:" + type);
    //获取文件大小
    long size = file.getSize();

    //文件存储的磁盘
    File uploadParentFile = new File(fileUploadPath);
    //判断文件目录是否存在
    if(!uploadParentFile.exists()) {
        //如果不存在就创建文件夹
        uploadParentFile.mkdirs();
    }
    //定义一个文件唯一标识码(UUID)
    String uuid = UUID.randomUUID().toString();
    String fileUUID = uuid + StrUtil.DOT + type;
    File uploadFile = new File(fileUploadPath + fileUUID);

    //将临时文件转存到指定磁盘位置
    file.transferTo(uploadFile);

    //设置下载的文件路径
    String url = "http://localhost:9090/file/" + fileUUID;

    //存储至数据库
    Files saveFile = new Files();
    saveFile.setName(originalFilename);
    saveFile.setType(type);
    saveFile.setSize(size/1024);//转成kb
    saveFile.setUrl(url);
    fileMapper.insert(saveFile);

    return url;
}
2.3 优化代码

springboot上传文件,SpringBoot,spring boot,java,后端

由于我们上传上去的图片有重复的,所以我们需要去重,只让他们共享一个图像

去重的思路为:将文件的二进制流转换为MD5编码,每当我们上传一个文件就将其二进制流MD5与数据库当中已保存的文件的二进制流MD5进行比较,相同就舍弃,不相同就将文件的信息保存至数据库,文件内容上传至文件夹。

/**
 * 文件上传接口
 * @param file
 * @return
 * @throws IOException
 */
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IOException {
    //获取文件原始名称
    String originalFilename = file.getOriginalFilename();
    //获取文件的类型
    String type = FileUtil.extName(originalFilename);
    log.info("文件类型是:" + type);
    //获取文件大小
    long size = file.getSize();

    //文件存储的磁盘
    File uploadParentFile = new File(fileUploadPath);
    //判断文件目录是否存在
    if(!uploadParentFile.exists()) {
        //如果不存在就创建文件夹
        uploadParentFile.mkdirs();
    }

    //定义一个文件唯一标识码(UUID)
    String uuid = UUID.randomUUID().toString();
    String fileUUID = uuid + StrUtil.DOT + type;
    File uploadFile = new File(fileUploadPath + fileUUID);

    String url;
    // 获取文件的md5
    String md5 = SecureUtil.md5(file.getInputStream());
    // 从数据库查询是否存在相同的记录
    Files dbFiles = fileService.getFileByMd5(md5);
    if (dbFiles != null) { // 文件已存在
        url = dbFiles.getUrl();
    } else {
        // 上传文件到磁盘
        file.transferTo(uploadFile);
        // 数据库若不存在重复文件,则不删除刚才上传的文件
        url = "http://localhost:9090/file/" + fileUUID;
    }


    //存储至数据库
    Files saveFile = new Files();
    saveFile.setName(originalFilename);
    saveFile.setType(type);
    saveFile.setSize(size/1024);//转成kb
    saveFile.setUrl(url);
    saveFile.setMd5(md5);
    fileService.save(saveFile);

    return url;
}

FileServiceImpl.java文章来源地址https://www.toymoban.com/news/detail-679953.html

@Service
public class FileServiceImpl extends ServiceImpl<FileMapper, Files> implements IFileService {

    /**
     * 根据MD5查询文件
     * @param md5
     * @return
     */
    @Override
    public Files getFileByMd5(String md5) {
        LambdaQueryWrapper<Files> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Files::getMd5, md5);
        List<Files> list = this.list(queryWrapper);
        return list.size() == 0 ? null : list.get(0);
    }

}

到了这里,关于使用SpringBoot优雅的实现文件上传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • springboot实现文件上传和读取

    在 nginx 上创建images目录,用来存储上传的文件 (使用nginx的好处是暴露端口,便于外界访问,同时nginx作为静态资源服务器在处理静态资源方面更快) 不然你访问文件就需要通过文件输入输出流进行输出 使用MultipartFile类提供的API方法,把临时文件转存到本地磁盘目录下 Multip

    2024年02月04日
    浏览(34)
  • SpringBoot+Vue实现文件上传功能

    目录 1.后端代码部分: 2.前端代码部分 3.效果展示 1.后端代码部分: 2.前端代码部分 3.效果展示      

    2024年02月12日
    浏览(34)
  • springboot实现minio文件分片上传

    在Spring Boot中实现MinIO的文件分片上传涉及到几个关键步骤。MinIO是一个高性能的分布式对象存储服务,它兼容Amazon S3的API。分片上传主要用于上传大文件,将大文件分成多个部分,分别上传,最后再将这些部分合并成一个完整的文件。这样做的好处是提高了上传的可靠性,并

    2024年01月17日
    浏览(39)
  • SpringBoot 如何实现文件上传和下载

    当今Web应用程序通常需要支持文件上传和下载功能,Spring Boot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍Spring Boot如何实现文件上传和下载,同时提供相应的代码示例。 Spring Boot提供了Multipart文件上传的支持。Multipart是HTTP协议中的一种方式,用

    2024年02月15日
    浏览(27)
  • springboot实现文件上传到minio

    一、前言 最近在项目中用的使用minio来上传文件,因此在这里给告诉大家如何实现 二、实现文件上传至minio 1.添加相关的maven依赖 2.minio连接配置 (1)首先配置minio属性 (2)接着配置minio连接,代码如下: (3)在YAML添加minio配置 3.定义minio工具类,代码如下: 4.编写实现文件

    2024年02月09日
    浏览(26)
  • SpringBoot上传文件的实现与优化

    文件上传是指客户端将本地的文件通过HTTP协议发送到服务器端的过程。文件上传是Web开发中常见的功能之一,例如用户可以上传头像、照片、视频、文档等各种类型的文件。文件上传涉及到客户端和服务器端的交互,需要考虑文件的大小、格式、安全性、存储方式等多方面的

    2024年02月11日
    浏览(24)
  • Springboot实现上传文件,并实现调用第三方接口post请求多文件上传文件

    项目过程中,经常会有和第三方接口打交道的过程,今天实现调用第三方上传文件的接口!! 通常拿到第三方的接口文档的时候,不是第一时间先写代码,而是详细阅读接口文档。若接口需要第三方提供的基本参数,例如signkey, secrect等,也可以是其他的,查看文档里是否提

    2024年02月16日
    浏览(35)
  • SpringBoot整合Minio实现文件上传、下载

    SpringBoot整合Minio实现文件上传、下载: 1,介绍高性能分布式存储文件服务Minio:Minio是 基于Go语言编写的对象存储服务 , 适合于存储大容量非结构化的数据 ,例如 图片、音频、视频、日志文件、备份数据和容器/虚拟机镜像等 ,而一个对象文件可以是任意大小,从几kb到最

    2024年02月06日
    浏览(34)
  • SpringBoot+Vue实现大文件分块上传

    由于用户需求,需要上传大量图片,只能通过上传压缩包的形式上传,可是压缩包过大时,又会出现上传超时的情况,故需要将压缩包分块上传,然后解压缩图片、若图片过大则再对图片进行压缩。 分块上传我在用的时候发现有两种:第一种:分块合并接口全由后端接口生成

    2024年02月07日
    浏览(23)
  • SpringBoot使用post方式上传文件

    file.transferTo(dest):将文件file存到dest这个文件位置。 设置header的 Content-Type为multipart/form-data 设置Body为form-data,设置key为file,点value的输入框,去选择要上传的文件

    2024年02月11日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包