.Net程式測試阿里雲OSS開放儲存服務
阿里雲官網有提供OSS相關的操作API文件和.Net程式的 SDK,也可以在這裡下載OSS相關檔案
但是API文件裡面的都是通過http請求和響應的訊息來描述如何操作OSS的
而一般在程式中需要的是OSS操作類的說明
本文將通過.Net SDK來建立一個簡單的程式連線並測試OSS,並舉出幾個常見的操作例子
在所有測試開始之前,首先要知道連線並操作OSS上面Bucket或Object的大概流程(關於Bucket和Object的概念詳見官網解釋)
OssClient類
顧名思義,是客戶端連線OSS並提供相關操作的類
其建構函式有四個,詳見.Net SDK幫助文件,如圖:
本文中只是用第二個建構函式(其餘可自行研究)
OssClient ossClient = new OssClient("OSS的地址","AccessId","AccessKey");
三個引數中,OSS的地址是根據OSS所在的地區決定的
其餘地區類似
AccessId和AccessKey可以在阿里雲使用者中心得到
點選使用者中心,進入我的服務
我們可以通過一個OssManager類來管理和建立OssClient
public static class OssManager { private static string _accessId = "youAccessId"; private static string _accessKey = "yourAccessKey"; private static string _http = "http://oss-cn-shenzhen.aliyuncs.com"; private static OssClient ossClient; public static OssClient GetInstance() { if (ossClient == null) { ossClient = new OssClient(_http, _accessId, _accessKey); } return ossClient; } }
Bucket常見操作:
建立Bucket和刪除Bucket
由於這兩種操作的程式碼類似,只是操作型別不一樣
所以定義一個列舉
public enum OperationType
{
Create,
Delete
}
新建BucketOperator類
public static class BucketOperator { /// <summary> /// Bucket操作的方法 /// </summary> /// <param name="type">操作型別</param> /// <param name="bucketName">bucketName</param> /// <param name="msg">輸出的訊息</param> /// <returns>0表示成功,否則失敗</returns> public static int Operator(OperationType type, string bucketName, out string msg) { if (bucketName == "") { msg = "please input the bucket name!"; return -1; } //獲得一個OssClient實利 OssClient client = OssManager.GetInstance(); try { //判斷操作型別 switch (type) { case OperationType.Create: //執行建立Bucket client.CreateBucket(bucketName); break; case OperationType.Delete: //執行刪除Bucket client.DeleteBucket(bucketName); break; default: break; } msg = ""; return 0; } //通過OssException Oss異常類來捕獲異常 catch (OssException ex) { //建立Bucket時該名稱的Bucket已存在 if (ex.ErrorCode == OssErrorCode.BucketAlreadyExists) { msg = string.Format("Bucket '{0}' already exists, please modify and recreate it.", bucketName); } //其他異常處理 else { msg = string.Format("Create failed. Error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } return -1; } } }
接下來建立一個web應用程式來測試
在專案中新增BucketTest.aspx頁面,拖入一個文字框以輸入BucketName和兩個按鈕
在後臺按鈕的點選事件中呼叫OssManeger類和BuekctOperator類來進行Bucket的建立和刪除操作
protected void btnCreate_Click(object sender, EventArgs e)
{
string msg = "";
int res = BucketOperator.Operator(OperationType.Create, txtName.Text, out msg);
if (res != 0)
{
Response.Write(msg);
}
}
protected void btnDelete_Click(object sender, EventArgs e)
{
string msg = "";
int res = BucketOperator.Operator(OperationType.Delete, txtName.Text, out msg);
if (res != 0)
{
Response.Write(msg);
}
}
接下來就可以就行對Bucket操作的測試了
先開啟OSS控制檯,可以看到Bucket只有一個:jchubby
執行BucketTest.aspx頁面
輸入jchubby1,點選建立
重新重新整理Bucket列表,建立成功
輸入一個已經存在的Bucket名,如:bookshop
新增失敗,輸出失敗異常的資訊
輸入jchubby1點選刪除,再次重新整理Bucket列表,jchubby1刪除成功
新建ObjectTest.aspx頁面
Object常見操作:
PutObject--將一個指定的Object加入指定的Bucket中
說白了這個方法就是講本地的一個檔案轉成OssObject然後儲存到OSS中指定的Bucket中
由於是Web頁面,這裡使用到了SWFUpload上傳檔案
有關SWFUpload的配置使用請看:SWFUpload配置
注意,在IE瀏覽器可能會禁用載入一些選項導致SWFUpload無法顯示
設定SWFUpload的接受頁面是upload.ashx
在upload.ashx ProcessRequest方法中,程式碼如下:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//獲得上傳的檔案
HttpPostedFile file = context.Request.Files["Filedata"];
if (file != null)
{
//獲取當前時間
string firstName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
//獲取檔案字尾
string lastName = Path.GetExtension(file.FileName);
//組合成儲存的檔名
string fullName = firstName + lastName;
//if (!string.IsNullOrEmpty(c.prefix))
// fullName = c.prefix + "/" + fullName;
ObjectMetadata metadata = new ObjectMetadata();
// 可以設定自定義的metadata。
metadata.ContentType = file.ContentType;
//獲取該檔案的輸入流
using (var fs = file.InputStream)
{
OssClient ossClient = OssManager.GetInstance();
//將該檔案流儲存到OSS中
var ret = ossClient.PutObject("jchubby", fullName, fs, metadata);
}
context.Response.Write("ok;" + fullName);
}
}
執行ObjectTest.aspx頁面
點選批量上傳
隨便選擇兩個檔案
確定之後開始上傳
成功之後到OSS控制檯對應的Bucket下檢視
上傳成功
ListObjects("bucketName")--獲得指定Bucket下的所有Object列表
在ObjectTest頁面的Page_Load事件中獲得指定Bucket下的Object列表,並顯示
程式碼如下:
protected List<OssObjectSummary> list;
private OssClient client;
protected void Page_Load(object sender, EventArgs e)
{
client = OssManager.GetInstance();
ObjectListing listing = client.ListObjects("jchubby");
list = listing.ObjectSummaries.ToList();
}
在前臺頁面,通過一個foreach遍歷list集合
<table>
<tr>
<td>BucketName
</td>
<td>Key
</td>
<td>LastModified
</td>
<td>Size
</td>
<td>StorageClass
</td>
<td>
Operation
</td>
</tr>
<% foreach (OssObjectSummary item in list)
{
%>
<tr>
<td><%=item.BucketName %>
</td>
<td><%=item.Key %>
</td>
<td><%=item.LastModified %>
</td>
<td><%=item.Size %>
</td>
<td><%=item.StorageClass %>
</td>
</tr>
<% } %>
</table>
執行ObjectTest頁面
獲取成功
關於OssObjectSummary類的相關屬性請看.Net SDK幫助文件
GetObject--獲得執行Bucket下執行的Object
DeleteObject--刪除指定Bucket下的Object
GetObject這個方法其實就是根據給的BucketName和ObjectKey來得到OSS上儲存的檔案
要儲存在本地電腦的話需要用檔案流來儲存
在ObjectTest頁面中拖入控制元件如下:
在獲取按鈕的點選事件中,程式碼如下:
protected void btnGet_Click(object sender, EventArgs e)
{
//獲取Object
OssObject obj = client.GetObject("jchubby", txtName.Text.Trim());
if (obj != null)
{
try
{
// Object流處理
int numBytesRead = 0;
int numBytesToRead = (int)obj.Metadata.ContentLength;
byte[] bytes = new byte[numBytesToRead];
FileStream fs = new FileStream("F:\\" + obj.Key, FileMode.Create);
// 將流寫入本地檔案儲存
while (numBytesToRead > 0)
{
int n = obj.Content.Read(bytes, numBytesRead, Math.Min(numBytesToRead, int.MaxValue));
if (n <= 0)
{ break; }
fs.Write(bytes, numBytesRead, n);
numBytesRead += n;
numBytesToRead -= n;
}
fs.Close();
Response.Write("GetObject Done");
}
//異常處理
catch (OssException ex)
{
Response.Write(string.Format("ErrorCode:{0}\n Message:{1}", ex.ErrorCode, ex.Message));
}
}
}
在刪除按鈕的點選事件中,程式碼如下:
protected void btnDel_Click(object sender, EventArgs e)
{
try
{
client.DeleteObject("jchubby", txtName.Text.Trim());
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
執行測試頁面
輸入一個已存在的Object名
點選獲取
儲存完畢之後,在指定的資料夾下已存在該檔案
點選刪除,重新整理Object列表
該檔案已從OSS上刪除
CopyObject--將指定的Object複製為另外一個Object
ObjectTest頁面加入以下控制元件:
在複製按鈕的點選事件中,程式碼如下:
protected void btnCopy_Click(object sender, EventArgs e)
{
CopyObjectResult res = client.CopyObject(new CopyObjectRequest("jchubby", txtOldName.Text.Trim(), "jchubby", txtNewName.Text.Trim()));
if (res != null)
{
Response.Write("ok");
}
}
執行結果可自行測試
以上為OSS比較常見的操作,全部原始碼Demo下載:點選開啟連結