最近在做一個新的項目,從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,這個我猜測可能是公有雲和私有雲的區別,有了解的同學可以交流一下。最近一直在做數據存儲方面的項目,如果描述或者程序有錯,請指出,謝謝~