云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

X File Storage: 一行代码上传,适配国内所有主流云存储平台

jxf315 2025-03-03 19:05:05 教程文章 27 ℃

对象存储

对象存储(Object Storage)是一种计算机数据存储架构,将数据作为对象进行管理。

每个对象包括数据本身、元数据和一个唯一的标识符,这种方式使得对象存储在大规模数据管理、索引和搜索方面具有明显优势。

发展历史

  • 起源:1995年,Garth Gibson团队首次提出对象存储的概念。1999年,希捷公司介绍了早期的对象存储命令集。
  • 商业化:1999年,Gibson创立了Panasas公司,商业化了对象存储的概念。
  • 云存储:2006年,亚马逊推出S3云存储服务,推动了对象存储的广泛应用。微软和谷歌随后也推出了自己的对象存储服务。
  • 大规模应用:2009年,Facebook开发了自己的对象存储系统Haystack,用于存储和管理海量照片,数据规模是万亿级

目前主要云存储服务

名称

发布时间

亚马逊S3

2006年

微软Azure Blob存储

2010年

谷歌云存储

2010年

阿里云OSS

2011年

华为云OBS

2015年

Amazon S3

Amazon Simple Storage Service(Amazon S3)是一种高可扩展性、低延迟且经济高效的对象存储解决方案,它不仅提供了存储和检索数据的服务,还定义了一套标准化的API协议,成为行业事实上的标准。类似地,还有OpenAI。

核心概念

概念

描述

存储桶(Bucket)

S3 中存储数据的基本容器,每个存储桶名称在 AWS 区域内必须唯一。

对象(Object)

存储在 S3 中的基本数据单位,包括数据、元数据和唯一标识符(Key)。

键(Key)

对象在存储桶中的唯一标识符,可以理解为对象的路径。

元数据(Metadata)

关于对象的数据,包括标准元数据(如文件大小、上次修改时间)和用户定义的元数据。

主要功能

功能

描述

数据持久性和可用性

提供 99.999999999% 的数据持久性,数据自动跨多个可用区(Availability Zones)复制。

安全性和访问控制

支持多种访问控制机制,包括 IAM、存储桶策略、ACL 和预签名 URL。

版本控制

启用版本控制,保留对象的所有版本,便于数据恢复和保护。

生命周期管理

定义对象生命周期规则,自动将数据转移到更低成本的存储类或在规定时间后删除数据。

数据传输

支持标准上传、分段上传、大数据传输加速和直接数据复制等多种数据传输机制。

查询功能

使用 Amazon S3 Select 和 S3 Glacier Select 直接查询存储在 S3 中的数据,无需下载整个对象。

常见使用场景

使用场景

描述

备份和恢复

作为企业数据的备份和恢复解决方案。

数据归档

通过 S3 Glacier 存储类,进行长期存储和归档数据。

内容分发

与 CloudFront 集成,实现全球内容分发。

大数据分析

存储大数据,并与 Amazon EMR、AWS Glue 等服务集成进行分析。

X File Storage

X File Storage是一个文件存储解决方案,支持多种存储平台,包括本地存储、FTP、SFTP、WebDAV、云存储(如阿里云 OSS、腾讯云 COS、百度云 BOS、Amazon S3、Google Cloud Storage 等)。用户只需一行代码即可将文件存储到任意支持的平台上,并支持在不同平台之间迁移文件。

项目地址:https://github.com/dromara/x-file-storage

支持的平台

X File Storage支持广泛的存储平台,你也可以根据需要自行扩展。

对于兼容Amazon S3的存储平台,直接将配置写在Amazon S3中即可,具体兼容性见下图。

快速入门

以下是一个简单的示例,展示了如何在Spring Boot环境下使用X File Storage将文件上传到阿里云OSS。

配置依赖

pom.xml文件中添加以下依赖:



    org.dromara.x-file-storage
    x-file-storage-spring
    2.2.1



    com.aliyun.oss
    aliyun-sdk-oss
    3.16.1



    com.huaweicloud
    esdk-obs-java
    3.22.12

配置文件

application.yml文件中添加以下配置:

dromara:
  x-file-storage:
    default-platform:aliyun-oss-1
    aliyun-oss:
        -platform:aliyun-oss-1
        enable-storage:true
        access-key:your-access-key
        secret-key:your-secret-key
        end-point:your-end-point
        bucket-name:your-bucket-name
        domain:https://your-domain/
        base-path: test/

启动类配置

在启动类上加上@EnableFileStorage注解:

@EnableFileStorage
@SpringBootApplication
public     class SpringFileStorageTestApplication{
    public static void main(String[] args){
        SpringApplication.run(SpringFileStorageTestApplication.class, args);
    }
}

文件上传示例

在控制器中编写文件上传接口:

@RestController
publicclassFileDetailController{

    @Autowired
    private FileStorageService fileStorageService;

    @PostMapping("/upload")
    public FileInfoupload(MultipartFile file){
        return fileStorageService.of(file).upload();
    }

    @PostMapping("/upload-image")
    public FileInfouploadImage(MultipartFile file){
        return fileStorageService.of(file)
            .image(img -> img.size(1000,1000))
            .thumbnail(th -> th.size(200,200))
            .upload();
    }
}

其它功能

X File Storage提供了丰富的功能,包括:

1、文件下载:支持从任意存储平台下载文件。

2、文件删除:可轻松删除存储在不同平台上的文件。

3、文件复制和移动:支持跨平台文件复制和移动。

下面代码示意,从阿里云 OSS迁移文件到华为云 OBS

@Slf4j
@SpringBootTest
classFileStorageServiceTransferTest{
    @Autowired
    private FileStorageService fileStorageService;

    /**
     * 从存储平台读取迁移
     */
    @Test
    public void transferByPlatform(){
        // 源存储平台
        String fromPlatform ="aliyun-oss-1";
        // 目标存储平台
        String toPlatform ="huawei-obs-1";
        // 要迁移的路径
        String path ="";
        // 开始迁移
        transfer(fromPlatform, toPlatform, path);
    }

    /**
     * 使用数据库迁移文件
     */
    public void transfer(String fromPlatform,String toPlatform,String path){

        // 列出当前路径下所有目录及文件
        ListFilesResult result = fileStorageService
            .listFiles()
            .setPlatform(fromPlatform)
            .setPath(path)
            .listFiles();

        // 递归迁移所有子目录
        for(RemoteDirInfo dir : result.getDirList()){
            transfer(fromPlatform, toPlatform, path + dir.getName()+"/");
        }

        // 迁移当前路径下所有文件
        for(RemoteFileInfo remoteFileInfo : result.getFileList()){
            FileInfo fileInfo = remoteFileInfo.toFileInfo();

            Map fromMetadata =new KebabCaseInsensitiveMap<>(fileInfo.getMetadata());
            Map toMetadata =newHashMap<>();
            if(fromMetadata.containsKey(Constant.Metadata.CONTENT_TYPE)){
                toMetadata.put(Constant.Metadata.CONTENT_TYPE, fromMetadata.get(Constant.Metadata.CONTENT_TYPE));
            }
            if(fromMetadata.containsKey(Constant.Metadata.CONTENT_LENGTH)){
                toMetadata.put(Constant.Metadata.CONTENT_LENGTH, fromMetadata.get(Constant.Metadata.CONTENT_LENGTH));
            }
            if(fromMetadata.containsKey(Constant.Metadata.CONTENT_DISPOSITION)){
                    toMetadata.put(
                Constant.Metadata.CONTENT_DISPOSITION, fromMetadata.get(Constant.Metadata.CONTENT_DISPOSITION));
            }
            fileInfo.setMetadata(toMetadata);

            // 使用复制文件,会保留旧文件,推荐
            fileStorageService
                .move(fileInfo)
                .setPlatform(toPlatform)
                .setNotSupportMetadataThrowException(true)// 不支持元数据时抛出异常
                .setNotSupportAclThrowException(true)// 不支持 ACL 时抛出异常
                .setProgressListener((progressSize, allSize)-> log.info(
                "文件 {}/{} 迁移进度:{} {}%",
                            fileInfo.getPath(), fileInfo.getFilename(), progressSize, progressSize *100/ allSize))
                .move();
            }
    }
}

4、文件哈希计算:提供文件哈希值计算功能,确保文件完整性。

5、分片上传和下载:支持大文件分片上传和下载,提高传输效率。

int partNumber = 1;//分片号。每一个上传的分片都有一个分片号,一般情况下取值范围是1~10000
byte[] bytes = FileUtil.readBytes("C:\\001.part");//分片数据,和基本的上传方式一样,也支持各种数据源
FilePartInfo filePartInfo = fileStorageService.uploadPart(fileInfo, partNumber, bytes, (long) bytes.length).upload();

6、文件元数据管理:提供丰富的文件元数据管理功能,方便文件查询和管理。

总结

  • 多平台支持:集成多种主流存储平台,用户可以根据需要自由选择和切换。
  • 简易集成:通过简单的配置和一行代码即可完成文件操作,降低开发复杂度。
  • 高效性能:优化的文件传输和存储机制,保证高效、可靠的文件管理。
  • 灵活扩展:模块化设计,支持灵活扩展和定制,满足不同业务需求。

更多详细信息和使用方法请参阅 官方文档[1]

引用链接

[1] 官方文档: https://x-file-storage.xuyanwu.cn

最近发表
标签列表