.Net程序测试阿里云OSS开放存储服务

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/41862311 阿里云官网有提供OSS相关的操作API文档和.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/41862311

阿里云官网有提供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下载:点击打开链接



相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
相关文章
|
3月前
|
存储 人工智能 Cloud Native
阿里云渠道商:OSS与传统存储系统的差异在哪里?
本文对比传统存储与云原生对象存储OSS的架构差异,涵盖性能、成本、扩展性等方面。OSS凭借高持久性、弹性扩容及与云服务深度集成,成为大数据与AI时代的优选方案。
|
5月前
|
存储 运维 安全
阿里云国际站OSS与自建存储的区别
阿里云国际站对象存储OSS提供海量、安全、低成本的云存储解决方案。相比自建存储,OSS具备易用性强、稳定性高、安全性好、成本更低等优势,支持无限扩展、自动冗余、多层防护及丰富增值服务,助力企业高效管理数据。
|
5月前
|
存储 域名解析 前端开发
震惊!不买服务器,还可以用阿里云国际站 OSS 轻松搭建静态网站
在数字化时代,利用阿里云国际站OSS可低成本搭建静态网站。本文详解OSS优势及步骤:创建Bucket、上传文件、配置首页与404页面、绑定域名等,助你快速上线个人或小型业务网站,操作简单,成本低廉,适合初学者与中小企业。
|
8月前
|
存储 人工智能 Kubernetes
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,是用户在云上存储的高性价比选择…
|
9月前
|
存储 Kubernetes 对象存储
StrmVol存储卷:如何解锁K8s对象存储海量小文件访问性能新高度?
如何提升海量文件的数据读取速率,对于AI训练集管理、量化回测、时序日志分析等场景尤为重要。阿里云容器服务(ACK))支持StrmVol类型存储卷,基于底层虚拟块设备及内核态文件系统,显著降低海量小文件访问延迟。
|
9月前
|
存储 Kubernetes 对象存储
StrmVol 存储卷:解锁 K8s 对象存储海量小文件访问性能新高度
本文介绍了阿里云容器服务(ACK)支持的StrmVol存储卷方案,旨在解决Kubernetes环境中海量小文件访问性能瓶颈问题。通过虚拟块设备与内核态文件系统(如EROFS)结合,StrmVol显著降低了小文件访问延迟,适用于AI训练集加载、时序日志分析等场景。其核心优化包括内存预取加速、减少I/O等待、内核态直接读取避免用户态切换开销,以及轻量索引快速初始化。示例中展示了基于Argo Workflows的工作流任务,模拟分布式图像数据集加载,测试结果显示平均处理时间为21秒。StrmVol适合只读场景且OSS端数据无需频繁更新的情况,详细使用方法可参考官方文档。
856 144
|
9月前
|
存储 弹性计算 数据管理
阿里云对象存储oss怎么收费?存储费用+流量收费标准
阿里云对象存储OSS收费标准包含存储费、流量费及请求费等,支持按量付费与包年包月两种模式。标准型本地冗余存储按量付费价格为0.09元/GB/月,包年包月500GB预留空间优惠价118元/年。流量费仅收取公网出方向费用,忙时0.50元/GB,闲时0.25元/GB。更多详情可参考官方页面。
1906 91
|
8月前
|
存储 人工智能 测试技术
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
OSSFS 2.0通过轻量化协议设计、协程化技术及FUSE3低级API重构,实现大文件顺序读写与小文件高并发加载的显著提升,在实际测试中表现出高达数十倍的吞吐量增长。适用于机器学习训练、推理等对高带宽低延迟要求严苛的场景,同时支持静态和动态挂载方式,方便用户在ACK集群中部署使用。
838 34
|
7月前
|
存储 关系型数据库 MySQL
成本直降30%!RDS MySQL存储自动分层实战:OSS冷热分离架构设计指南
在日均订单量超500万的场景下,MySQL数据年增200%,但访问集中在近7天(85%)。通过冷热数据分离,将历史数据迁移至OSS,实现存储成本下降48%,年省72万元。结合RDS、OSS与Redis构建分层架构,自动化管理数据生命周期,优化查询性能与资源利用率,支撑PB级数据扩展。
501 3