文章目录
设计背景
- 对接私有化存储组件,解耦现行对象存储KS3
设计目标
- 成功解耦现行对象存储KS3
- 完成基于配置文件灵活配置实现对接不同种类的私有化存储组件
- 提取接口实现面向接口完成文件上传下载更新
设计思路
- 通过参数控制的方式初始化不同的私有化存储实现类,面向接口调用实现文件上传、下载、删除
功能设计
代码目录
-
processor
-
conifg
- FastDFSConfig
- FileHandlerType
- InitConfig
- KS3Config
-
exception
- FastDFSException
-
fastDFS
- FastDFSFileHandler
-
ks3
- KS3FileHandler
-
util
- FileUtil
FileHandler
-
接口设计
init 初始化
- 接口代码
public void init(FileHandlerType type, InitConfig initConfig);
- 参数
参数名称 | 参数描述 |
---|---|
FileHandlerType | 文件处理器类型[ks3,fastDFS] |
InitConfig | 初始化配置对象 |
public class InitConfig {
private KS3Config ks3Config;
private FastDFSConfig fastDFSConfig;
}
- 配置类属性
public class KS3Config {
private String ak;
private String sk;
private String endpoint;
private String bucket;
private int timeout;
}
public class FastDFSConfig {
String fastdfsConfigPath;
}
- 初始化失败将产生异常,需在业务代码中手动处理异常
upload 文件上传
- 接口代码
public String upload(byte[] bytes, String key);
- 参数
参数名称 | 参数说明 |
---|---|
byte[] | 文件字节数组 |
key | 文件标识(一般以文件名作为key,fastDFS可以重复,ks3不可重复) |
- 返回值
返回值类型 | 返回值说明 | 例子 |
---|---|---|
String类型字符串 | 文件访问全路径 | group1/M00/00/00/wKg7Z1vgElSACjysAAXYM5DIOHQ518.jpg http://ks3-cn-beijing.ksyun.com/securitycloud/1.jpg |
- 上传失败将抛出异常,需在业务代码中手动处理异常
download 文件下载
- 接口代码
public byte[] download(String key);
- 参数
参数名称 | 参数说明 |
---|---|
key | 文件标识,ks3方式为upload时上传时的key,fastDFS为上传时的返回值 |
- 返回值
返回值类型 | 返回值说明 |
---|---|
byte[] | 文件字节数组 |
- 下载失败将抛出异常,需在业务代码中手动处理异常
delete 文件删除
- 接口代码
public void delete(String key);
- 参数
参数名称 | 参数说明 |
---|---|
key | 文件标识,ks3方式为upload时上传时的key,fastDFS为上传时的返回值 |
- 删除失败将抛出异常,需在业务代码中手动处理异常
异常处理
- 自定义异常类FastDFSException
public class FastDFSException extends RuntimeException {
public static final String UN_INIT_EXCEPTION = "fastDFS未进行配置文件初始化,或者初始化配置文件失败";
public static final String INPUT_STREAM_ISNULL = "输入文件流为空";
public static final String FILENAME_ISNULL = "输入文件名为空";
public static final String FILE_SUFFIX_ERROR = "文件名格式有误,获取文件名后缀失败";
public static final String FILE_UPLOAD_FAILED = "文件上传失败";
public static final String FILEPATH_ISNULL = "输入文件全路径为空";
public static final String FILE_NOT_EXIST = "文件不存在";
public static final String FILE_DOWNLOAD_FAILED = "文件下载失败";
public static final String FILE_DELETE_FAILED = "文件删除失败";
String message;
public FastDFSException() {
super();
}
public FastDFSException(@NotNull String message) {
super(message);
}
public FastDFSException(@NotNull String message, Exception e) {
super(message,e);
}
}
- KS3产生的异常由引用的金山云ks3包封装。
配置文件说明
fastdfs-client.properties
# 连接超时 针对connect调用时超时 单位s
fastdfs.connect_timeout_in_seconds = 5
# socket send/write和recv/read的连接超时时间 单位s
fastdfs.network_timeout_in_seconds = 30
# 编码格式
fastdfs.charset = UTF-8
# 设置为true表示开启token验证
fastdfs.http_anti_steal_token = false
# 密钥
fastdfs.http_secret_key = FastDFS1234567890
# tracker服务的http端口
fastdfs.http_tracker_http_port = 80
# 客户端连接tracker服务的ip端口配置
fastdfs.tracker_servers = 172.16.2.2:22122,172.16.2.21:22122
使用demo(springboot)
- 代码实例
@Service
public class FileService {
private FileHandler fileHandler;
@Value("${file.handler.type}")
public String fileHandlerType;
private int retryTime = 3;
private int timeout = 5000;
@Value("${ks3.ak}")
private String ak;
@Value("${ks3.sk}")
private String sk;
@Value("${ks3.endpoint}")
private String endpoint;
@Value("${ks3.bucket}")
private String bucket;
@PostConstruct
public void init() {
fileHandler = new FileHandler();
InitConfig initConfig = new InitConfig();
initConfig.setKs3Config(ak, sk, endpoint,bucket, timeout);
String configPath = this.getClass().getResource("/fastdfs-client.properties").getPath();
initConfig.setFastDFSConfig(configPath);
try {
if (fileHandlerType.equals(FileHandlerType.fastDFS.name())) {
fileHandler.init(FileHandlerType.fastDFS,initConfig);
} else if (fileHandlerType.equals(FileHandlerType.ks3.name())) {
fileHandler.init(FileHandlerType.ks3,initConfig);
} else {
throw new RuntimeException("注入的fileHandlerType不符合预设标准");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public FileHandler getFileHandler() {
return fileHandler;
}
- 流程说明
首先封装InitConfig配置类,将所有的参数进行配置,然后调用init方法,通过配置文件中的fileHandlerType进行判断使用何种私有化存储。实现基于配置文件灵活配置。