1. 程式人生 > >.Net程式測試阿里雲OSS開放儲存服務

.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下載:點選開啟連結