zoukankan      html  css  js  c++  java
  • .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}. 
    RequestID:{2}	HostID:{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}
     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下载:点击打开链接


    
  • 相关阅读:
    Spring 事务不回滚
    Druid详细配置信息
    Servlet和JSP规范及版本对应关系
    CDN(内容分发网络)技术原理
    开发者需要了解的WebKit
    浏览器的渲染原理简介
    在浏览器中输入Google.com并且按下回车之后发生了什么?
    为什么说DOM操作很慢
    亿级Web系统搭建——单机到分布式集群
    linux下用rinetd做端口转发
  • 原文地址:https://www.cnblogs.com/jchubby/p/4429709.html
Copyright © 2011-2022 走看看