.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下载:点击打开链接
.Net程序测试阿里云OSS开放存储服务的更多相关文章
- 阿里云OSS对象存储服务(二)
一.使用SDK 在OSS的概览页右下角找到"Bucket管理",点击"OSS学习路径" 点击"Java SDK"进入SDK开发文档 二.创建 ...
- 阿里云OSS对象存储服务(一)
一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...
- 阿里云之OSS 开放存储服务开发笔记
在使用云服务以后,你不用考虑他是否能承受压力,而是费用.不要考虑是否被攻击,而是他的API实现.本人开发阿里云服务也走了些崎岖之路,写下以备忘之. 阿里云的开放存储服务可以提供文件的存储服务,开放了上 ...
- Java使用阿里云OSS对象存储上传图片
原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- C# .net Ueditor实现图片上传到阿里云OSS 对象存储
在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- iOS使用阿里云OSS对象存储 (SDK 2.1.1)
最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...
- 阿里云OSS的 存储包、下行流量包、回流流量包 三者有啥关系
阿里云OSS的 存储包.下行流量包.回流流量包 三者有啥关系 一.总结 一句话总结: 你把文件放 oss,会占用存储空间,存储包覆盖这部分费用 你访问存储在 oss 里面的文件,会产生下行流量,就是从 ...
- PHP 上传文件至阿里云OSS对象存储
简述 1.阿里云开通对象存储服务 OSS 并创建Bucket 2.下载PHP SDK至框架扩展目录,点我下载 3.码上code 阿里云操作 开通对象存储服务 OSS 创建 Bucket 配置Acces ...
随机推荐
- 洛谷 P2114 [NOI2014]起床困难综合症 解题报告
P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...
- Tomcat学习笔记(七)
Tomcat载入器(一) 在了解tomcat的载入器时,首先需要了解的是java的类加载部分的内容. 在java体系中,系统分为3中类型的加载器 1.启动类加载器(Bootstrap ClassLoa ...
- linux低权限执行高权限
1.关于sudo不需要输密码,低权限执行高权限,在root下的命令visudo放开%wheel ALL:保存退出, 执行gpasswd -a yourusername wheel 2.脚本命令下的,权 ...
- Topcoder SRM548 Div 1
1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...
- 取代VS, sourceISight的IDE神器CLION
https://www.jetbrains.com/clion/download/download-thanks.html 随时升级 http://idea.lanyus.com/ m_pRemoti ...
- [9018_1563][bzoj_2144]跳跳棋
题目描述 Hzwer的跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 某一天,黄金大神和cjy用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.他们 ...
- 算法详解(LCA&RMQ&tarjan)补坑啦!完结撒花(。◕ˇ∀ˇ◕)
首先,众所周知,求LCA共有3种算法(树剖就不说了,太高级,以后再学..). 1.树上倍增(ST表优化) 2.RMQ&时间戳(ST表优化) 3.tarjan(离线算法)不讲..(后面补坑啦!) ...
- 从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver【转】
转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...
- 【转载】Java文件编码自动转换工具类
本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...
- MongoDB中$redact操作符的使用
介绍 redact <- redaction 修订/校验,意思是对文档内容进行过滤,选择一些过滤或保留的信息 . access level 存取等级 有三种: - $$DESCEND 返回当前等 ...