zoukankan      html  css  js  c++  java
  • 数据备份的OSS接口

    最近在做一个新的项目,从RDS备份到OSS,进行数据备份以及后续的还原。这边对阿里云的OSS数据上传接口进行说明,先做下笔记先简单介绍下OSS:

    ①Object

    在OSS中,用户操作的基本数据单元是Object。单个Object最大允许存储5TB的数据。Object包含key、meta和data。其中,key是Object的名字;meta是用户对该object的描述,由一系列name-value对组成;data是Object的数据。

    其中Object命名规范:使用UTF-8编码;长度必须在1-1023字节之间;不能以“/”或者“”字符开头。

    命名demo1:example.txt 这个在Bucket内存储的就是一个文件。

    命名demo2:cd/example.txt 这个在Bucket内存储的就是一个文件夹的形式,一级目录是cd,二级目录才是文件example.txt。等下我会在下面的demo实例中给出截图。

    ②Bucket

    存储在OSS上的每个Object必须都包含在某个Bucket中。这个去阿里的OSS上注册OSS实体Bucket。系统会给用户分配一对Access Key ID和Access Key Secret,称为ID对,用于标识用户,为访问OSS的每个Bucket做签名验证。

    1)文件存储到OSS:

    我们使用的是OSSClient中的方法public PutObjectResult putObject(String bucketName, String key,  File file, ObjectMetadata metadata)

    参数介绍:

    bucketName:你的Bucket名称

    key:就是你存储Object的路径,也就是上面介绍的Object命名。like:"example.tar"

    file:你存储到OSS上的文件

    metadata:ObjectMetaData是用户对该object的描述,由一系列name-value对组成。这里我们直接设为空。

    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.PutObjectResult;
    
    import java.io.File;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    /**
     * Created by XuHui on 2016/9/28.
     */
    public class TestJava {
        static  String accessKeyId = "Your Access Key ID";//你注册OSS建立实例Bucket的accessKeyId和accessKeySecret
        static  String accessKeySecret = "Your Access Key Secret";
        static  String endPoint = "OSS url";//OSS的访问地址
        static String bucketName = "bucket-example";//Bucket的名称
        public static  void main(String[] rags)throws Exception{
            //上传的File
            File file = new File("C:\Users\Desktop\example.tar");
            OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
            //objKey是存储到Bucket的Object的相对路径
            String objKey = "example.tar";
            ObjectMetadata objMetadata = new ObjectMetadata();//objMetadata可为空
            PutObjectResult result = ossClient.putObject(bucketName, objKey, file, objMetadata);
            System.out.print("PutObjectResult " + result + ", " + result.getETag());
    
        }
    }

     看看Bukect的存储效果

    2)URL下载内容存储到OSS:

    我们使用的是OSSClient中的方法public PutObjectResult putObject(String bucketName, String key, InputStream input, ObjectMetadata metadata)

    参数介绍:

    bucketName:你的Bucket名称

    key:就是你存储Object的路径,也就是上面介绍的Object命名。like:"cd/example.tar"

    input:也就是输入流,这个我们把Url内容存储到OSS的Bukect上,其实也就是转化为流的方式进行存储的。这样做的目的主要就是url下载File,把File上传到OSS,这样会大大影响存储速率。所以在项目中数据备份都是通过流的方式,而不是建立中间临时文件。

    metadata:ObjectMetaData是用户对该object的描述,由一系列name-value对组成。这里我们直接设为空。

    注:获取流的方法除了我下面写的,还有我注释掉的bis = url.openStream()这种方法同样可以获取到InputStream。

    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.PutObjectResult;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    /**
     * Created by XuHui on 2016/9/28.
     */
    public class TestJava {
        static  String accessKeyId = "Your Access Key ID";//你注册OSS建立实例Bucket的accessKeyId和accessKeySecret
        static  String accessKeySecret = "Your Access Key Secret";
        static  String endPoint = "OSS url";//OSS的访问地址
        static  String bucketName = "bucket-example";//Bucket的名称
        public static  void main(String[] rags)throws Exception{
            //上传的Url地址
            String path = "Your Download Url";
            URL url = new URL(path.trim());
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream bis = urlConnection.getInputStream();
            //bis = url.openStream();
            //创建OSSClient
            OSSClient ossClient = new OSSClient(endPoint, accessKeyId, accessKeySecret);
            //objKey是存储到Bucket的Object的相对路径
            String objKey = "cd/example.tar";
            ObjectMetadata objMetadata = new ObjectMetadata();//objMetadata可为空
            PutObjectResult result = ossClient.putObject(bucketName, objKey, bis, objMetadata);
            System.out.print("PutObjectResult " + result + ", " + result.getETag());
    
        }
    }

    下面直接看下存储的Bucket效果吧

          这边我说一个这个程序很奇怪的问题,这边我自己弄了好久。OSS的访问endPoint地址,我的Bucket上信息显示oss-cn-hangzhou-am24-a.**.lab.com,用这个地址一直不能上传,之后我改成地址前面加BucketName:bucket-for-rds.oss-cn-hangzhou-am24-a.**.lab.com才好使。

      这个遇到的同学还可以尝试endPoint前面加BukectName,这个我猜测可能是公有云和私有云的区别,有了解的同学可以交流一下。最近一直在做数据存储方面的项目,如果描述或者程序有错,请指出,谢谢~

  • 相关阅读:
    Ubuntu Server中怎样卸载keepalived
    Winform中实现ZedGraph滚轮缩放后自动重新加载数据
    Winform中自定义添加ZedGraph右键实现设置所有Y轴刻度的上下限
    C#中获取多个对象list中对象共有的属性项
    Windows7中启动Mysql服务时提示:拒绝访问的一种解决方式
    八、子查询实践
    四、bootstrap-Table
    二、sql新增后返回主键|sql 使用 FOR XML PATH实现字符串拼接|sql如果存在就修改不存在就新增
    一、动词、名词、形容词汇位置
    三、TortoiseSVN 单独拉取项目某个文件
  • 原文地址:https://www.cnblogs.com/jave1ove/p/5924314.html
Copyright © 2011-2022 走看看