.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所在的地区决定的

比如在深圳的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下载:点击打开链接



posted @ 2014-12-11 09:21  蒋源德  阅读(3771)  评论(1编辑  收藏  举报