Skip to content

对象存储(OSS)

概述

盘古封装了兼容S3协议的通用对象存储组件pangea-common-oss,支持兼容S3协议的云存储,如:

同时,无论是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>

手动下载地址:http://nexus.hisense.com/repository/maven-hisense-release/com/hisense/pangea/pangea-common-oss/2.8.6/pangea-common-oss-2.8.6.jar

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_KEYpangea.oss.path-style-access的那条数据的CONFIG_VALUE是否为true