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