阿里雲官網有提供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所在的地區決定的
比如在深圳的OSS地址為http://oss-cn-shenzhen.aliyuncs.com
杭州的OSS地址為http://oss-cn-hangzhou.aliyuncs.com
其余地區類似
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下載:點擊打開鏈接
