SpringBoot实现云存储功能
一、引入相应云平台SDK
<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>${qiniu.version}</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>${aliyun.oss.version}</version> </dependency> <dependency> <groupId>com.qcloud</groupId> <artifactId>cos_api</artifactId> <version>${qcloud.cos.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
二、定义抽象类 CloudStorageService ,用来声明上传的公共接口,如下所示:
/** * 云存储(支持七牛、阿里云、腾讯云、又拍云) * */ public abstract class CloudStorageService { /** 云存储配置信息 */ CloudStorageConfig config; /** * 文件路径 * @param prefix 前缀 * @param suffix 后缀 * @return 返回上传路径 */ public String getPath(String prefix, String suffix) { //生成uuid String uuid = UUID.randomUUID().toString().replaceAll("-", ""); //文件路径 String path = DateUtils.format(new Date(), "yyyyMMdd") + "/" + uuid; if(StringUtils.isNotBlank(prefix)){ path = prefix + "/" + path; } return path + suffix; } /** * 文件上传 * @param data 文件字节数组 * @param path 文件路径,包含文件名 * @return 返回http地址 */ public abstract String upload(byte[] data, String path); /** * 文件上传 * @param data 文件字节数组 * @param suffix 后缀 * @return 返回http地址 */ public abstract String uploadSuffix(byte[] data, String suffix); /** * 文件上传 * @param inputStream 字节流 * @param path 文件路径,包含文件名 * @return 返回http地址 */ public abstract String upload(InputStream inputStream, String path); /** * 文件上传 * @param inputStream 字节流 * @param suffix 后缀 * @return 返回http地址 */ public abstract String uploadSuffix(InputStream inputStream, String suffix); }
三、
1、七牛上传的实现,只需继承 CloudStorageService ,并实现相应的上传接口,如下所示:
/** * 七牛云存储 * */ public class QiniuCloudStorageService extends CloudStorageService { private UploadManager uploadManager; private String token; public QiniuCloudStorageService(CloudStorageConfig config){ this.config = config; //初始化 init(); } private void init(){ uploadManager = new UploadManager(new Configuration(Zone.autoZone())); token = Auth.create(config.getQiniuAccessKey(), config.getQiniuSecretKey()). uploadToken(config.getQiniuBucketName()); } @Override public String upload(byte[] data, String path) { try { Response res = uploadManager.put(data, path, token); if (!res.isOK()) { throw new RuntimeException("上传七牛出错:" + res.toString()); } } catch (Exception e) { throw new RRException("上传文件失败,请核对七牛配置信息", e); } return config.getQiniuDomain() + "/" + path; } @Override public String upload(InputStream inputStream, String path) { try { byte[] data = IOUtils.toByteArray(inputStream); return this.upload(data, path); } catch (IOException e) { throw new RRException("上传文件失败", e); } } @Override public String uploadSuffix(byte[] data, String suffix) { return upload(data, getPath(config.getQiniuPrefix(), suffix)); } @Override public String uploadSuffix(InputStream inputStream, String suffix) { return upload(inputStream, getPath(config.getQiniuPrefix(), suffix)); } }