对象存储(OSS)
概述
盘古封装了兼容S3
协议的通用对象存储组件pangea-common-oss
,支持兼容S3协议的云存储,如:
- 集团存储平台(http://10.19.44.209:8060)
- MINIO
- 阿里云
- 华为云
- 腾讯云
- 京东云
同时,无论是Spring-boot、Spring还是纯Java项目,均可通过oss组件调用S3存储服务。
事前准备
若使用集团存储平台
,需提前申请对象存储空间,可参考集团存储平台使用说明
申请流程
登录http://hiit.hisense.com/,申请路径:服务目录 > 基础运维服务 > 对象存储空间申请。
申请流程走向: 申请人所在部门领导 > 网络系统部部门领导 > 对象存储交付工程师 >申请人确认
申请需要填写以下内容
- 1.标题(xxx生产系统申请50G对象存储)
- 2.项目名称
- 3.申请原因(填写具体申请原因,方便领导审批)
- 4.项目负责人
- 5.机房位置(系统虚拟机或物理机所在机房位置)
- 6.操作系统类型
- 7.到期日期
- 8.ip地址或地址段
- 9.申请空间总大小(单位GiB)
- 10.存储桶数量 (默认是一个)
- 11.单个存储桶大小(默认容量=空间总大小)
使用方法
1.Spring-boot、Spring项目
1)在工程pom.xml
中添加依赖
html
<!-- 盘古对象存储模块 -->
<dependency>
<groupId>com.hisense.pangea</groupId>
<artifactId>pangea-common-oss</artifactId>
<version>${pangea.version}</version>
</dependency>
2)配置文件
方式一:在yml配置文件添加以下作为默认配置
pangea:
oss:
#使用私有云OSS(如:minio、集团存储平台)需要开启为true,如果使用云OSS(如:阿里云、七牛云)需要设置为false
path-style-access: true
#EOS对外服务的访问域名
endpoint: http://10.19.44.209:8060
# AK(AccessKeyId), 一定注意复制完整不要有空格
access-key: xxx
# SK(SecretAccessKeyID),一定注意复制完整不要有空格
secret-key: xxx
# 存储空间名称,即桶名称
bucketName: pig4cloud
#代理地址,https系统必填,http系统忽略(具体填写方式在下文“代理地址配置”中详解)
agencyAdress:https://xx.xx.xx
方式二:在系统中配置参数
如果您使用的是盘古平台搭建的系统,可在基础服务
→文件管理
→云存储配置
中调整参数。 系统中配置的参数的优先级高于yml文件中的配置,且可在运行时配置,直接生效。
3)代码使用
做好以上两步配置后,可直接在代码中使用相关方法,包括上传文件、下载文件、预览文件等等。
常用方法举例
java
@Value("${pangea.oss.bucketName}")
private String bucketName;
@Value("${pangea.oss.agencyAdress}")
private String agencyAdress;
@Autowired
private OssTemplate template;
/**
* 上传文件
*/
@PostMapping("uploadFile")
public void uploadFile(@RequestParam("file") MultipartFile file,String bucketName) throws Exception {
String fileName = file.getOriginalFilename();
ossTemplate.putObject(bucketName,fileName,file.getInputStream());
}
/**
* 删除文件
*/
@DeleteMapping("remove")
public void remove(String fileName) {
ossTemplate.removeObject(bucketName,fileName);
}
/**
* 下载文件
*/
@GetMapping("download")
public void download(String fileName) throws IOException {
ossTemplate.getObject(bucketName, fileName);
}
/**
* 获取预览地址
*/
@GetMapping("getViewUrl")
public String getViewUrl(String fileName) {
return ossTemplate.getObjectUrlWithOutTime(bucketName,fileName,agencyAdress);
}
4)代理地址配置
配置代理地址的是因为对象存储(OSS)大部分是支持http协议(如,集团存储平台http://10.19.44.209:8060),而大部分业务系统支持的协议是https。 这会导致文件预览时发生错误。
——集团存储平台
集团存储平台提供的访问地址为http://10.19.44.209:8060,前端默认采用域名/xsky
的方式调用接口,其中拼接的"xsky"项目组可自定义, 通过反向代理获取真实的集团存储平台地址.
操作方法:
1.配置pangea.oss.agencyAdress
,假设域名是https://pangea.dev.devapps.hisense.com
,则https://pangea.dev.devapps.hisense.com/xsky
,这个是要被代理的地址
2.前端nginx添加代理逻辑
location /xsky/ {
proxy_pass http://10.19.44.209:8060/;
}
填写示例:
——MINIO
minio支持动态地址配置,前端默认采用域名/minio
的方式调用minio接口,通过反向代理获取真实的minio地址
操作方法:
1.配置pangea.oss.agencyAdress
,假设域名是https://pangea.dev.devapps.hisense.com
,则https://pangea.dev.devapps.hisense.com/minio
是要被代理的地址
2.前端nginx添加代理逻辑
location /minio/ {
proxy_pass http://minio域名/;
}
2.Java项目
因java项目无法通过配置自动加载生成,需构造生成AmazonS3客户端,具体步骤如下:
1)引入pangea-common-oss
依赖,版本需>=2.8.6
html
<!-- 盘古对象存储模块 -->
<dependency>
<groupId>com.hisense.pangea</groupId>
<artifactId>pangea-common-oss</artifactId>
<version>${pangea.version}</version>
</dependency>
2)将存储服务的配置参数set到OssProperties,并创建OssTemplate
如下:(具体参数含义请参照上文)
java
OssProperties ossProperties=new OssProperties();
ossProperties.setBucketName("mybucket");
ossProperties.setAccessKey("xxxxxxxxxx");
ossProperties.setSecretKey("xxxxxxxxxx");
ossProperties.setEndpoint("http://xxxxxx");
ossProperties.setPathStyleAccess(true);
OssTemplate template = new OssTemplate(ossProperties);
3)构造生成AmazonS3客户端
如下:
java
template.createS3Client(ossProperties);
4)调用方法
做好以上三步后,可直接在代码中使用相关方法,包括上传文件、下载文件、预览文件等等。
- 完整demo示例如下:
java
public static void main(String[] args) throws Exception {
File file = new File("C:/Users/duyi/Desktop/duyi.png");
System.out.println("start");
OssProperties ossProperties=new OssProperties();
ossProperties.setBucketName("mybucket");
ossProperties.setAccessKey("xxxxxxxx");
ossProperties.setSecretKey("xxxxxxxx");
ossProperties.setEndpoint("http://xxxxxx");
ossProperties.setPathStyleAccess(true);
OssTemplate template = new OssTemplate(ossProperties);
//构造生成AmazonS3客户端
template.createS3Client(ossProperties);
//上传
FileInputStream inputStream = new FileInputStream(file);
template.putObject("mybucket","duyi.png",inputStream);
//下载(s3object.getObjectContent()可获得文件流,后续文件流如何处理由业务方自己定义)
S3Object s3Object=template.getObject("mybucket", "duyi.png");
//获得url
String url= template.getObjectUrlWithOutTime("mybucket", "duyi.png");
System.out.println("url========="+url);
//删除
template.removeObject("mybucket","duyi.png");
System.out.println("end");
}
注意事项
- 如果使用集团存储平台(http://10.19.44.209:8060),请将桶策略为
可读可写
,否则系统中用户无法上传下载。
xml
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::桶名称/*"
]
}
]
}
常见问题
Q:使用私有云OSS(minio)文件上传失败,提示java.net.UnknownHostException: testbucket.minio-employ.hisense.com
(桶的名字拼在endpoint前面)
原因:设置问题导致对象上传地址拼接不正确
解决方案:
1.确认配置文件中path-style-access是否为true
2.确认数据库SYS_CONFIG表中CONFIG_KEY
为pangea.oss.path-style-access
的那条数据的CONFIG_VALUE
是否为true