.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下载:点击打开链接