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



.Net程序测试阿里云OSS开放存储服务的更多相关文章

  1. 阿里云OSS对象存储服务(二)

    一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...

  2. 阿里云OSS对象存储服务(一)

    一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...

  3. 阿里云之OSS 开放存储服务开发笔记

    在使用云服务以后,你不用考虑他是否能承受压力,而是费用.不要考虑是否被攻击,而是他的API实现.本人开发阿里云服务也走了些崎岖之路,写下以备忘之. 阿里云的开放存储服务可以提供文件的存储服务,开放了上 ...

  4. Java使用阿里云OSS对象存储上传图片

    原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...

  5. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

  6. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  7. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  8. 阿里云OSS的 存储包、下行流量包、回流流量包 三者有啥关系

    阿里云OSS的 存储包.下行流量包.回流流量包 三者有啥关系 一.总结 一句话总结: 你把文件放 oss,会占用存储空间,存储包覆盖这部分费用 你访问存储在 oss 里面的文件,会产生下行流量,就是从 ...

  9. PHP 上传文件至阿里云OSS对象存储

    简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...

随机推荐

  1. POJ3585 Accumulation Degree 【树形dp】

    题目链接 POJ3585 题解 -二次扫描与换根法- 对于这样一个无根树的树形dp 我们先任选一根进行一次树形dp 然后再扫一遍通过计算得出每个点为根时的答案 #include<iostream ...

  2. 交叉编译HTOP并移植到ARM嵌入式Linux系统

    原创作品,允许转载,转载时请务必以超链接形式标明文章.作者信息和本声明,否则将追究法律责任. 最近一直在完善基于Busybox做的ARM Linux的根文件系统,由于busybox是一个精简的指令集组 ...

  3. Runtime.getRuntime().exec方法

    Runtime.getRuntime().exec()方法主要用于执行外部的程序或命令. Runtime.getRuntime().exec共有六个重载方法: public Process exec( ...

  4. img 标签下多余空白的解决方法

    在浏览器中,图片默认的vertical-align是baseline.那么,我们该如何去掉这多余的空白呢? 1)将图片转换为块级 img{display:block;} 2) 设置图片的垂直对齐方式 ...

  5. 手动删除Win7系统服务列表中残留服务的操作步骤

    卸载tomcat的时候服务用cmd运行不能删除 需要用管理员才能删除 手动删除Win7系统服务列表中残留服务的操作步骤分享给大家,在使用深度Win7系统过程中,将一些程序删除后,有些在服务列表中还会残 ...

  6. error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)(转)

    原文转自:http://blog.sina.com.cn/s/blog_639a2ad70101kpen.html 编译directshow若干问题的解决 1.安装好windows sdk,进入dir ...

  7. fatal error LNK1104: 无法打开文件“LIBC.lib”错误(转)

    原文转自 http://blog.csdn.net/qq1028850792/article/details/41546043 方法一: 用VS2005重新编译某个工程的发生了链接错误,现在把这个解决 ...

  8. Linux的日志错误级别

    讯息等级 系统将讯息分为七个主要的等级,依序是由不重要排列到重要讯息等级: info:仅是一些基本的讯息说明而已: notice:比 info 还需要被注意到的一些信息内容: warning 或 wa ...

  9. 初学springMVC的拦截器

    springMvc拦截器的执行顺序! 拦截器的各个方法的作用: /** * 登录验证拦截器 */      public class Intercepter implements HandlerInt ...

  10. AC日记——可能的路径 51nod 1247

    可能的路径 思路: 看到题目想到gcd: 仔细一看是更相减损: 而gcd是更相减损的优化版: 所以,对于每组数据判断gcd是否相等就好: 来,上代码: #include <cstdio> ...