# combofs **Repository Path**: shadowedge/combofs ## Basic Information - **Project Name**: combofs - **Description**: 同一文件系统API - **Primary Language**: Java - **License**: Unlicense - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-11-12 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 统一文件存储SDK ## 典型使用:默认文件系统、默认Oracle数据源 ### 环境准备 0. 添加私服 由于SDK均未存放在中央库内,因此需要对工程添加私服才可远程下载依赖库: ```xml shadowedge-git https://raw.githubusercontent.com/shadowedge/maven/master/repository/ ``` 1. 引入SDK 使用标准文件系统: ```xml keter combofs-starter-fs 0.2.1.RELEASE ``` 使用S3存储: ```xml keter combofs-starter-s3 0.2.1.RELEASE ``` 3. 添加配置 文件系统: ```ini #--- 文件存储根目录 ---# combofs.root=e:/temp/fs ``` s3: ```ini combofs.s3.bucket=your_bucket combofs.s3.endpoint=your_endpoint combofs.s3.accessKey=your_accessKey combofs.s3.secretKey=your_secretKey ``` ### 开始使用 注入ComboFs接口对象: ```java @Autowired private ComboFs fs; ``` S3环境可以使用专属接口,具有部分特性功能: ```java @Autowired private ComboS3 fs; ``` 使用API操作文件: ```java // 测试用的本地文件 String testFileUri = "e:/temp/test.xml"; java.io.File f = new java.io.File(testFileUri); // 保存文件:只保存文件流 ComboFile file = fs.save(Files.toByteArray(f)); logger.info("读取文件: id={}, uri={}",fs.getComboFile(file.getId()).getId(),fs.getComboFile(file.getId()).getUri()); Assert.isTrue ("61a070c47acf2e43eed674bc70ca8b9f".equals(fs.getMD5(file.getId())),"比对MD5"); logger.info("读取文件流:性能最好!"); Files.write(fs.getBytes(file.getId()),new java.io.File("e:/temp/output.xml")); logger.info("读取文件完整信息: id={}",fs.getComboFile(file.getId()).getId()); // 保存文件:保存流和文件元数据 // 构建元数据 FileMeta meta = FileMeta.build() .add("kaka","keke") .add("haha","hehe"); file = fs.save(Files.toByteArray(f) ,meta); logger.info("读取文件:{}",fs.getComboFile(file.getId())); logger.info("文件删除:"); Long id = 1234L; fs.delete(id); ``` SDK支持文件MD5读取功能,但在文件保存时并不进行计算,而是异步持久化md5信息。 如需校验,调用方可在文件保存成功后可通过API自行读取比对。 ## 扩展使用:其他文件系统、其他数据源(进行中) 如需使用其他文件系统或数据源,则需在应用中提供相应的依赖库组件和配置即可。 ## 设计说明 - 统一存取 SDK统一使用字节数组(byte[])保存文件,写入成功后返回文件唯一ID(Snowflake Sequence) SDK通过ID进行文件读取 - 元数据存储 SDK支持对Map形式提供的文件元数据进行存储,前提是需要提供数据源 - 自动目录生成 为避免同一目录下存放大量文件,SDK会对文件ID取HashCode后映射到256(一级)*16(二级)的子目录,并以**文件ID作为文件名**统一保存文件。 - 模块按需加载 SDK会根据当前应用中的依赖库存在情况判断使用何种组件, 如:依赖库中引入了S3驱动,则使用S3文件系统; 依赖库中引入了Mysql/Sqlite/MongoDB驱动,则使用MySql/Sqlite/Mongodb作为数据源(未实现); 也可以通过`配置文件`强制使用的文件系统或数据源类型(未实现) - 组件可替换 可以使用自定义组件替换默认策略,目前支持ID生成策略、目录生成策略等。 替换方法:自定义类实现SDK接口,声明为Spring容器组件即可,如: ```java @Component public class MyId implements IdMaker { @Override public Long makeId() { // 随机ID:仅用于示例,不可用于生产系统! return RandomUtils.nextLong(); } } ```