共计 3691 个字符,预计需要花费 10 分钟才能阅读完成。
最近在做一个新的项目,从 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,这个我猜测可能是公有云和私有云的区别,有了解的同学可以交流一下。最近一直在做数据存储方面的项目,如果描述或者程序有错,请指出,谢谢~
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-12/138745.htm