XSpringFileStorage整合oss集成和测试存储服务

  • XSpringFileStorage简介

    • 在 SpringBoot 中通过简单的方式将文件存储到 本地、FTP、SFTP、WebDAV、谷歌云存储、阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云 BOS、又拍云USS、MinIO、 AWS S3、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动云 EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的平台

使用:X Spring File Storage整合oss

  • 地址:https://spring-file-storage.xuyanwu.cn/#/快速入门

  • 添加阿里云OSS的SDK

    • 地址:https://help.aliyun.com/document_detail/32008.html

    • 添加maven依赖

      • 底层聚合工程添加版本
          <!--hutool工具类-->
          <dependency>
              <groupId>cn.hutool</groupId>
              <artifactId>hutool-all</artifactId>
              <version>5.8.10</version>
          </dependency>
         <!-- spring-file-storage 必须要引入 -->
          <dependency>
              <groupId>cn.xuyanwu</groupId>
              <artifactId>spring-file-storage</artifactId>
              <version>0.5.0</version>
          </dependency>
          <!-- 阿里云 OSS 不使用的情况下可以不引入 -->
          <dependency>
              <groupId>com.aliyun.oss</groupId>
              <artifactId>aliyun-sdk-oss</artifactId>
              <version>3.15.1</version>
          </dependency>
      
  • yml配置

spring:
  file-storage:
    aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写
      - platform: aliyun-oss-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: LTAI****NkM
        secret-key: PJB0****kwyhII7TH
        end-point: oss-cn-beijing.aliyuncs.com
        bucket-name: gtflog
        domain: https://gtflog.oss-cn-beijing.aliyuncs.com/
        base-path: hy/ # 基础路径
  • sql
-- 这里使用的是 mysql
CREATE TABLE `file_detail`
(
    `id`                varchar(32)  NOT NULL COMMENT '文件id',
    `url`               varchar(512) NOT NULL COMMENT '文件访问地址',
    `size`              bigint(20)   DEFAULT NULL COMMENT '文件大小,单位字节',
    `filename`          varchar(256) DEFAULT NULL COMMENT '文件名称',
    `original_filename` varchar(256) DEFAULT NULL COMMENT '原始文件名',
    `base_path`         varchar(256) DEFAULT NULL COMMENT '基础存储路径',
    `path`              varchar(256) DEFAULT NULL COMMENT '存储路径',
    `ext`               varchar(32)  DEFAULT NULL COMMENT '文件扩展名',
    `content_type`      varchar(32)  DEFAULT NULL COMMENT 'MIME类型',
    `platform`          varchar(32)  DEFAULT NULL COMMENT '存储平台',
    `th_url`            varchar(512) DEFAULT NULL COMMENT '缩略图访问路径',
    `th_filename`       varchar(256) DEFAULT NULL COMMENT '缩略图名称',
    `th_size`           bigint(20)   DEFAULT NULL COMMENT '缩略图大小,单位字节',
    `th_content_type`   varchar(32)  DEFAULT NULL COMMENT '缩略图MIME类型',
    `object_id`         varchar(32)  DEFAULT NULL COMMENT '文件所属对象id',
    `object_type`       varchar(32)  DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片',
    `attr`              text COMMENT '附加属性',
    `create_time`       datetime     DEFAULT NULL COMMENT '创建时间',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8
  ROW_FORMAT = DYNAMIC COMMENT ='文件记录表';

  • 自己需要使用数据库逆向工具

  • 这里需要注意的是文件id的自增属性。一定要设置哦

  • service

/**
 * @author gtf
 * @date 2022/11/22 15:41
 */
public interface FileService {

    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    String uploadPlatform(MultipartFile file);
}
  • serviceImpl(实现了 FileRecord 接口文件上传完毕后会自动保存到数据库)
package net.classes.service.impl;

import cn.hutool.core.bean.BeanUtil;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.xuyanwu.spring.file.storage.FileInfo;
import cn.xuyanwu.spring.file.storage.FileStorageService;
import cn.xuyanwu.spring.file.storage.recorder.FileRecorder;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.classes.mapper.FileDetailMapper;
import net.classes.model.FileDetailDO;
import net.classes.service.FileService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;

/**
 * @author gtf
 * @date 2022/11/22 15:42
 */
@Service
@Slf4j
public class FileStorageServiceImpl extends ServiceImpl<FileDetailMapper, FileDetailDO> implements FileRecorder, FileService {
    @Autowired(required = false)
    private FileStorageService fileStorageService;

    /**
     * 保存文件信息到数据库
     */
    @SneakyThrows
    @Override
    public boolean record(FileInfo info) {
        FileDetailDO detail = BeanUtil.copyProperties(info, FileDetailDO.class, "attr");

        //这是手动获 取附加属性字典 并转成 json 字符串,方便存储在数据库中
        if (info.getAttr() != null) {
            detail.setAttr(new ObjectMapper().writeValueAsString(info.getAttr()));
        }
        boolean b = save(detail);
        if (b) {
            info.setId(detail.getId());
        }
        return b;
    }

    /**
     * 根据 url 查询文件信息
     */
    @SneakyThrows
    @Override
    public FileInfo getByUrl(String url) {
        FileDetailDO detail = getOne(new QueryWrapper<FileDetailDO>().eq("url", url));
        FileInfo info = BeanUtil.copyProperties(detail, FileInfo.class, "attr");

        //这是手动获取数据库中的 json 字符串 并转成 附加属性字典,方便使用
        if (StringUtils.isNotBlank(detail.getAttr())) {
            info.setAttr(new ObjectMapper().readValue(detail.getAttr(), Dict.class));
        }
        return info;
    }

    /**
     * 根据 url 删除文件信息
     */
    @Override
    public boolean delete(String url) {
        return remove(new QueryWrapper<FileDetailDO>().eq("url", url));
    }

    /**
     * 文件上传并返回url
     *
     * @param file
     * @return
     */
    @Override
    public String uploadPlatform(MultipartFile file) {
        // 上传到指定的存储平台
        FileInfo upload = fileStorageService.of(file).setPlatform("aliyun-oss-1")    // 使用指定的存储平台
                .setPath(DateUtil.format(new Date(), "yyyy/MM/dd") + "/").upload();
        //异步保存文件到数据库
//        record(upload);
        //返回成功的url
        return upload.getUrl();
    }
}

启动类添加@EnableFileStorage

  • 测试

  • 数据库查看