此 C# SDK 适用于.NET Framework 2.0+ , .NET Core 以及UWP(Windows 10 通用应用),基于七牛云API参考手册构建。使用此 SDK 构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云存储上。无论您的网络应用是一个网站程序,还是包括从云端(服务端程序)到终端(手持设备应用)的架构的服务或应用,通过七牛云存储及其 SDK,都能让您应用程序的终端用户高速上传和下载,同时也让您的服务端更加轻盈。
安装
您可以在这里找到所有的Release,选择您需要的版本下载,解压后将*.dll文件添加至项目引用。需要注意的是,此SDK依赖Json.NET,可以添加对应版本Newtonsoft.Json.dll引用或者使用NuGet来安装它:
Install-Package Newtonsoft.Json
或者从NuGet来安装,以Visual Studio 2013/2015为例(如果您的Visual Studio没有安装NuGet,请先安装)。打开NuGet程序包管理器搜索Qiniu.Shared或者在控制台中键入以下命令:
Install-Package Qiniu.Shared
当然,您也可以直接从源码编译
git clone https://github.com/qiniu/csharp-sdk
鉴权
七牛C# SDK的上传、文件管理等功能需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的密钥:Access Key
和Secret Key
。
要接入七牛云存储,您需要拥有一对有效的 Access Key (以下简称AK) 和 Secret Key (以下简称SK) 用来进行签名认证。您可以登录七牛开发者平台,查看 AK 和 SK。如果没有账号,可以在七牛开发者平台开通一个七牛开发者帐号。
使用各种七牛API服务(如upload等)之前请确保AK & SK均已赋值:
// AK = "<YOUR_ACCESS_KEY>"
// SK = "<YOUR_SECRET_KEY>"
使用AK & SK构建Mac对象,然后使用Mac对象生成鉴权类Auth
,然后就可以生成上传凭证、管理凭证等(以下CreateXXToken
中的XXToken是是UploadToken
,DownloadToken
,ManageToken
之一):
using Qiniu.Util;
Mac mac = new Mac(AK, SK);
Auth auth = new Auth(mac);
auth.CreateXXToken(...);
或者使用Auth的静态方法:
using Qiniu.Util;
Mac mac = new Mac(AK, SK);
Auth.CreateXXToken(mac,...);
SDK设置
Zone设置
此步骤是必要的。
不同的空间(bucket)可能位于不同的机房(区域/Zone),因此文件管理/文件上传等操作需要正确配置Zone(位于Qiniu.Common
命名空间),默认配置为”华东机房”,用户可以有以下两种方法配置Zone:
1.直接配置( 如果确定机房所在Zone,可以使用此方法)
// ZoneID zoneId = ZoneID.CN_East;
// [CN_East:华东] [CN_South:华南] [CN_North:华北] [US_North:北美]
// USE_HTTPS = (true|false) 是否使用HTTPS
Qiniu.Common.Config.SetZone(zoneId,USE_HTTPS);
2.使用AutoZone自动配置(推荐使用这个方法)
// AK = ACCESS_KEY
// USE_HTTPS = (true|false) 是否使用HTTPS
// 使用前请确保AK和BUCKET正确,否则此函数会抛出异常(比如code612/631等错误)
Qiniu.Common.Config.AutoZone(AK,BUCKET,USE_HTTPS);
JSON解析器设置
这个步骤是可选的。
此SDK选用Newtonsoft.Json(也称作Json.NET)作为默认的JSON解析器,您也可以自行设置(分别设置Qiniu.JSON.JsonHelper
的两个属性:JsonSerializer
和JsonDeserializer
),可以参考如下示例。
首先定义您的JSON序列化(Serialize)、反序列化(Deserialize)方法(此例使用默认的Newtonsoft.Json来实现):
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Qiniu.JSON;
namespace CSharpSDKExamples
{
public class AnotherJsonSerializer : IJsonSerializer
{
// 实现此接口的JSON序列化方法
public string Serialize<T>(T obj) where T : new()
{
var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
return JsonConvert.SerializeObject(obj, settings);
}
}
public class AnotherJsonDeserializer : IJsonDeserializer
{
// 实现此接口的JSON反序列化方法
public bool Deserialize<T>(string str, out T obj) where T : new()
{
obj = default(T);
bool ok = true;
try
{
obj = JsonConvert.DeserializeObject<T>(str);
}
catch (System.Exception)
{
ok = false;
}
return ok;
}
}
}
然后在使用此SDK的其他功能(函数)之前设置JSON解析器,只需设置一次即可:
// 使用自定义的JSON序列化、反序列化方法
Qiniu.JSON.JsonHelper.JsonSerializer = new AnotherJsonSerializer();
Qiniu.JSON.JsonHelper.JsonDeserializer = new AnotherJsonDeserializer();
如果您希望摆脱Json.NET依赖(比如您只想使用其他更轻量、更高效的JSON解析器或者自行实现),可在此项目的github release中找到ext-json版本,或者安装NuGet上的Qiniu.Shared.ExtJson
版本,又或者参照此SDK源码的说明对Qiniu.JSON
模块稍作修改然后编译。
上传文件
上传流程
为了尽可能地改善终端用户的上传体验,七牛云存储首创了客户端直传功能。更多信息请参阅业务流程。
上传策略
上传策略包含了上传文件的各种配置。在PuPolicy(上传策略)中可以进行丰富的参数设置,比如:文件类型限制、大小限制、回调设置等等,可以参考上传策略,具体使用方法可参考下面的上传示例。
上传凭证
关于上传凭证的详细介绍,请参见上传凭证。可以使用Auth.CreateUploadToken
来生成上传凭证,请参考上述的“鉴权”部分或者后面的“上传文件”示例代码。
上传方式选择
表单上传:一般适用于文件体积较小的情形,请使用FormUploader
分片上传:适用于大文件或者需要支持断点续上传的情形,请使用ResumableUploader
自动选择:自动选择以上两种方式之一(但需要预先知道待上传文件或者数据(流)的大小),请使用UploadManager
需要注意的是,如果您需要上传“一种特殊的数据流(此流不支持查找)”时(例如NetworkStream,请参阅后面的“上传数据流”示例),请使用FormUploader或者ResumableUploader的UploadStream方法,因为这两个方法不需要预先知道流的长度。
简单上传
使用FormUploader,ResumableUploader或者UploadManager,以下代码示意了如何使用UploadManager来上传一个本地文件
using System;
using Qiniu.Common;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class UploadDemo
{
/// <summary>
/// 简单上传-上传小文件
/// </summary>
public void UploadFile()
{
// 生成(上传)凭证时需要使用此Mac
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string saveKey = "1.png";
string localFile = "D:\\QFL\\1.png";
// 上传策略,参见
// https://developer.qiniu.com/kodo/manual/put-policy
PutPolicy putPolicy = new PutPolicy();
// 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
// putPolicy.Scope = bucket + ":" + saveKey;
putPolicy.Scope = bucket;
// 上传策略有效期(对应于生成的凭证的有效期)
putPolicy.SetExpires(3600);
// 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
putPolicy.DeleteAfterDays = 1;
// 生成上传凭证,参见
// https://developer.qiniu.com/kodo/manual/upload-token
string jstr = putPolicy.ToJsonString();
string token = Auth.CreateUploadToken(mac, jstr);
UploadManager um = new UploadManager();
HttpResult result = um.UploadFile(localFile, saveKey, token);
Console.WriteLine(result);
}
}
}
字节数据上传
使用FormUploader,ResumableUploader或者UploadManager,以下代码示意了如何使用FormUploader来上传字节数据
using System;
using Qiniu.Common;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class UploadDemo
{
/// <summary>
/// 简单上传-上传字节数据
/// </summary>
public void UploadData()
{
// 生成(上传)凭证时需要使用此Mac
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string saveKey = "myfile";
byte[] data = System.IO.File.ReadAllBytes("D:/QFL/1.mp3");
//byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello World!");
// 上传策略,参见
// https://developer.qiniu.com/kodo/manual/put-policy
PutPolicy putPolicy = new PutPolicy();
// 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
// putPolicy.Scope = bucket + ":" + saveKey;
putPolicy.Scope = bucket;
// 上传策略有效期(对应于生成的凭证的有效期)
putPolicy.SetExpires(3600);
// 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
putPolicy.DeleteAfterDays = 1;
// 生成上传凭证,参见
// https://developer.qiniu.com/kodo/manual/upload-token
string jstr = putPolicy.ToJsonString();
string token = Auth.CreateUploadToken(mac, jstr);
FormUploader fu = new FormUploader();
HttpResult result = fu.UploadData(data, saveKey, token);
Console.WriteLine(result);
}
}
}
数据流上传
使用FormUploader,ResumableUploader或者UploadManager,如果预先不知道上传的流的长度,请使用FormUploader或者ResumableUploader,以下代码示意了如何使用FormUploader来上传一个网络流(“此流不支持查找操作”):
using System;
using Qiniu.Common;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class UploadDemo
{
/// <summary>
/// 上传(来自网络回复的)数据流
/// </summary>
public void UploadStream()
{
// 生成(上传)凭证时需要使用此Mac
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string saveKey = "1.jpg";
// 上传策略,参见
// https://developer.qiniu.com/kodo/manual/put-policy
PutPolicy putPolicy = new PutPolicy();
// 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"
// putPolicy.Scope = bucket + ":" + saveKey;
putPolicy.Scope = bucket;
// 上传策略有效期(对应于生成的凭证的有效期)
putPolicy.SetExpires(3600);
// 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除
putPolicy.DeleteAfterDays = 1;
// 生成上传凭证,参见
// https://developer.qiniu.com/kodo/manual/upload-token
string jstr = putPolicy.ToJsonString();
string token = Auth.CreateUploadToken(mac, jstr);
try
{
string url = "http://img.ivsky.com/img/tupian/pre/201610/09/beifang_shanlin_xuejing-001.jpg";
var wReq = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
var resp = wReq.GetResponse() as System.Net.HttpWebResponse;
using (var stream = resp.GetResponseStream())
{
// 请不要使用UploadManager的UploadStream方法,因为此流不支持查找(无法获取Stream.Length)
// 请使用FormUploader或者ResumableUploader的UploadStream方法
FormUploader fu = new FormUploader();
var result = fu.UploadStream(stream, "xuejing-001.jpg", token);
Console.WriteLine(result);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
覆盖上传
在上传策略中设置SCOPE = "BUCKET:KEY"
:
PutPolicy putPolicy = new PutPolicy();
putPolicy.Scope = bucket + ":" + saveKey;
其余部分代码类似。
断点续上传
对于大尺寸文件的上传,可能需要进行分片上传或者需要从中断后的位置继续上传,这时请使用ResumeUploader。
using System;
using Qiniu.Common;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class UploadDemo
{
/// <summary>
/// 上传大文件,可以从上次的断点位置继续上传
/// </summary>
public void UploadBigFile()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string saveKey = "1.mp4";
string localFile = "D:\\QFL\\1.mp4";
// 断点记录文件,可以不用设置,让SDK自动生成,如果出现续上传的情况,SDK会尝试从该文件载入断点记录
// 对于不同的上传任务,请使用不同的recordFile
string recordFile = "D:\\QFL\\resume.12345";
PutPolicy putPolicy = new PutPolicy();
putPolicy.Scope = bucket;
putPolicy.SetExpires(3600);
string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString());
// 包含两个参数,并且都有默认值
// 参数1(bool): uploadFromCDN是否从CDN加速上传,默认否
// 参数2(enum): chunkUnit上传分片大小,可选值128KB,256KB,512KB,1024KB,2048KB,4096KB
ResumableUploader ru = new ResumableUploader(false, ChunkUnit.U1024K);
// ResumableUploader.UploadFile有多种形式,您可以根据需要来选择
//
// 最简模式,使用默认recordFile和默认uploadProgressHandler
// UploadFile(localFile,saveKey,token)
//
// 基本模式,使用默认uploadProgressHandler
// UploadFile(localFile,saveKey,token,recordFile)
//
// 一般模式,使用自定义进度处理(可以监视上传进度)
// UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler)
//
// 高级模式,包含上传控制(可控制暂停/继续 或者强制终止)
// UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler,uploadController)
//
// 支持自定义参数
//var extra = new System.Collections.Generic.Dictionary<string, string>();
//extra.Add("FileType", "UploadFromLocal");
//extra.Add("YourKey", "YourValue");
//uploadFile(...,extra,...)
//最大尝试次数(有效值1~20),在上传过程中(如mkblk或者bput操作)如果发生错误,它将自动重试,如果没有错误则无需重试
int maxTry = 10;
// 使用默认进度处理,使用自定义上传控制
UploadProgressHandler upph = new UploadProgressHandler(ResumableUploader.DefaultUploadProgressHandler);
UploadController upctl = new UploadController(uploadControl);
HttpResult result = ru.UploadFile(localFile, saveKey, token, recordFile, maxTry, upph, upctl);
Console.WriteLine(result);
}
// 内部变量,仅作演示
private static bool paused = false;
/// <summary>
/// 上传控制
/// </summary>
/// <returns></returns>
private static UPTS uploadControl()
{
// 这个函数只是作为一个演示,实际当中请根据需要来设置
// 这个演示的实际效果是“走走停停”,也就是停一下又继续,如此重复直至上传结束
paused = !paused;
if (paused)
{
return UPTS.Suspended;
}
else
{
return UPTS.Activated;
}
}
}
}
上传&预转持续化
如果需要在在资源上传后自动触发持久化处理,在PutPolicy(上传策略)中设置persistentOps这一项即可。
PutPolicy putPolicy = new PutPolicy();
// ... (这里省略了putPolicy的一些设置)
putPolicy.PersistentOps = "PERSISTENT_OPS";
其中PERSISTENT_OPS
可以参考persistentOps详解
下载文件
下载可公开访问的文件
可下载网络上或者公开空间中的小文件(如文本、图片等)。
using System;
using Qiniu.Common;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class DownloadDemo
{
/// <summary>
/// 下载可公开访问的文件
/// </summary>
public void DownloadFile()
{
// 文件URL
string rawUrl = "http://img.ivsky.com/img/tupian/pre/201610/09/beifang_shanlin_xuejing-001.jpg";
// 要保存的文件名,如果已存在则默认覆盖
string saveFile = "D:\\QFL\\saved-snow.jpg";
// 可公开访问的url,直接下载
HttpResult result = DownloadManager.Download(rawUrl, saveFile);
Console.WriteLine(result);
}
}
}
下载私有空间中的文件
私有空间中的文件访问链接需要经过授权,生成授权下载链接的过程如下:
ACC_URL = RAW_URL+Expire+Token
比如原始链接http://example.com/file/1.jpg
加上过期时间戳 http://example.com/file/1.jpg?e=1476783956
(如果原始链接中已包含?打头的query字符串,则时间戳字符串改为&e=...
)
然后Auth生成token拼接上去 http://example.com/file/1.jpg?e=1476783956&token=Token
可参考下面的方法下载私有空间中的小文件:
using System;
using Qiniu.Common;
using Qiniu.Util;
using Qiniu.IO;
using Qiniu.IO.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class DownloadDemo
{
/// <summary>
/// 下载私有空间中的文件
/// </summary>
public void DownloadPrivateFile()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string rawUrl = "http://your-bucket.bkt.clouddn.com/1.jpg";
string saveFile = "D:\\QFL\\saved-1.jpg";
// 设置下载链接有效期3600秒
int expireInSeconds = 3600;
string accUrl = DownloadManager.CreateSignedUrl(mac, rawUrl, expireInSeconds);
// 接下来可以使用accUrl来下载文件
HttpResult result = DownloadManager.Download(accUrl, saveFile);
Console.WriteLine(result);
}
}
}
空间文件管理
支持的功能
下表列举了空间管理的一些基本功能(部分不常见的功能未在此列举):
功能 | 函数 | 说明 |
---|---|---|
获取文件信息 | Stat(bucket,key) | 文件名、大小、Hash等信息 |
修改文件类型 | Chgm(bucket,key,mimeType) | 修改后的类型为mimeType |
移动或重命名文件 | Move(srcBucket,srcKey,dstBucket,dstKey,[force]) | 可选参数force |
复制文件 | Copy(srcBucket,srcKey,dstBucket,dstKey,[force]) | 可选参数force |
删除文件 | Delete(bucket,key) | |
设置或更新文件生存时间 | UpdateLifecycle(bucket,key,days) | 设置days=0表示取消 |
获取空间文件列表 | ListFiles(bucket) | 另请参阅后面的“获取文件列表”示例 |
抓取网络资源到空间 | Fetch(resURL,bucket,key) | |
更新镜像空间中的文件 | Prefetch(resURL,bucket,key) | 空间bucket 设置了“镜像存储” |
资源管理批量操作 | Batch(opstr) | 另请参阅后面的“批量处理”示例 |
批量获取文件信息 | BatchStat(bucket,keys) | 参数keys是string数组 |
批量删除文件 | BatchDelete(bucket,keys) | 参数keys是string数组 |
简单处理
支持stat、copy、move、delete等,其中move/copy支持force参数(强制覆盖选项,即如果目标文件已存在,可以设置强制覆盖参数force来覆盖那个文件的内容)。
以下代码示意了如何获取空间中文件的信息(stat):
using System;
using Qiniu.Common;
using Qiniu.RS;
using Qiniu.RS.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public BucketDemo
{
/// <summary>
/// 获取文件基本信息
/// </summary>
public void Stat()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string key = "1.avi";
BucketManager bm = new BucketManager(mac);
StatResult result = bm.Stat(bucket, key);
Console.WriteLine(result);
}
}
}
其他操作类似。
批量处理
batch批处理请求的主体内容具有op=OP1&op=OP2&op=...这样的格式,其中op=OPS作为一个单位,用&符号相连,OPS是以上stat,copy,move,delete等操作字符串。
using System;
using Qiniu.Common;
using Qiniu.RS;
using Qiniu.RS.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class BucketDemo
{
/// <summary>
/// 批量操作
/// </summary>
public void Batch()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
// 批量操作类似于
// op=<op1>&op=<op2>&op=<op3>...
string batchOps = "op=OP1&op=OP2";
BucketManager bm = new BucketManager(mac);
var result = bm.Batch(batchOps);
// 或者
//string[] batch_ops={"<op1>","<op2>","<op3>",...};
//bm.Batch(batch_ops);
Console.WriteLine(result);
}
}
}
获取空间文件列表
在BucketManager类中提供了ListFiles方法ListFiles(bucket, prefix, marker, limit, delimiter)
.
该方法返回值中,有以下3个字段需要关注:
字段 | 含义 |
---|---|
Marker | 请参阅下述的marker参数 |
Items | 返回的结果,其中包括文件名、hash、大小等信息 |
CommonPrefixes | 请参阅下述的delimiter和prefix参数 |
函数参数说明如下:
参数 | 含义 |
---|---|
bucket | 目标空间名称 |
prefix | 返回指定文件名前缀的文件列表(prefix可设为null) |
marker | 考虑到设置limit后返回的文件列表可能不全(需要重复执行listFiles操作) 执行listFiles操作时使用marker标记来追加新的结果。特别注意首次执行listFiles操作时marker为null |
limit | 每次返回结果所包含的文件总数限制(limit最大值1000,建议值100) |
delimiter | 分隔符,比如-或者/等等,可以模拟作为目录结构(参考下述示例)。假设指定空间中有2个文件 fakepath/1.txt fakepath/2.txt 现设置delimiter=/ 得到结果items =[],commonPrefixes = [fakepath/] 调整prefix=fakepath/ delimiter=null 得到所需结果items=[1.txt,2.txt] 于是可以在本地先创建一个目录fakepath,然后在该目录下写入items中的文件 |
以下是一个获取文件列表的示例:
using System;
using Qiniu.Common;
using Qiniu.RS;
using Qiniu.RS.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public class BucketDemo
{
/// <summary>
/// 获取空间文件列表
/// </summary>
public void ListFiles()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string marker = ""; // 首次请求时marker必须为空
string prefix = null; // 按文件名前缀保留搜索结果
string delimiter = null; // 目录分割字符(比如"/")
int limit = 100; // 单次列举数量限制(最大值为1000)
BucketManager bm = new BucketManager(mac);
//List<FileDesc> items = new List<FileDesc>();
//List<string> commonPrefixes = new List<string>();
do
{
ListResult result = bm.ListFiles(bucket, prefix, marker, limit, delimiter);
Console.WriteLine(result);
marker = result.Result.Marker;
//if (result.Result.Items != null)
//{
// items.AddRange(result.Result.Items);
//}
//if (result.Result.CommonPrefixes != null)
//{
// commonPrefixes.AddRange(result.Result.CommonPrefixes);
//}
} while (!string.IsNullOrEmpty(marker));
//foreach (string cp in commonPrefixes)
//{
// Console.WriteLine(cp);
//}
//foreach(var item in items)
//{
// Console.WriteLine(item.Key);
//}
}
}
}
更新文件生命周期
using System;
using Qiniu.Common;
using Qiniu.RS;
using Qiniu.RS.Model;
using Qiniu.Http;
namespace CSharpSDKExamples
{
public BucketDemo
{
/// <summary>
/// 设置或更新文件生命周期
/// </summary>
public void UpdateLifecycle()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
string bucket = "test";
string key = "1.jpg";
BucketManager bm = new BucketManager(mac);
// 新的deleteAfterDays,设置为0表示取消lifecycle
int deleteAfterDays = 1;
BucketManager bm = new BucketManager(mac);
var result = bm.UpdateLifecycle(bucket, key, deleteAfterDays);
Console.WriteLine(result);
}
}
}
持久化操作
如果需要对已保存在空间中的资源进行云处理并将结果持久化,可以使用持久化数据处理,
如果需要使用独立资源的处理队列,建议先创建一个队列(可将队列名赋给下述示例中的pipeline变量),队列的创建可以参考音视频转码界面化操作队列
using System;
using Qiniu.Common;
using Qiniu.RSF;
using Qiniu.RSF.Model;
using Qiniu.Util;
namespace CSharpSDKExamples
{
public class ProcessingDemo
{
/// <summary>
/// 持久化并保存处理结果
/// </summary>
public void PfopAndSave()
{
string bucket = "test";
string key = "1.avi";
// 队列名称,如果没有,请设置为null
// 另请参阅https://qiniu.kf5.com/hc/kb/article/112978/
string pipeline = "MEDIAPROC_PIPELINE";
// 接收处理结果通知的URL,另请参阅
// http://developer.qiniu.com/code/v6/api/dora-api/pfop/pfop.html#pfop-notification
string notifyUrl = "NOTIFY_URL";
bool force = false;
// 要保存的目标空间
string dstBucket = "dest-bucket";
string dstKey = "2.mp4";
string saveAsUri = StringHelper.urlSafeBase64Encode(dstBucket + ":" + dstKey);
// 需要执行的数据处理,例如视频转码
string fopM = "FILE_OPS"; //示例: "avthumb/mp4";
// 使用管道'|'命令,将处理结果saveas另存
string fops = fopM + "|saveas/" + saveAsUri;
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
OperationManager ox = new OperationManager(mac);
PfopResult result = ox.Pfop(bucket, key, fops, pipeline, notifyUrl, force);
// 稍后可以根据PersistentId查询处理进度/结果
//string persistentId = result.PersistentId;
//HttpResult pr = ox.Prefop(persistentId);
//Console.WriteLine(pr);
Console.WriteLine(result);
}
}
}
其中FILE_OPS
就是要进行的操作,如:vframe/jpg/offset/1/w/480/h/360/rotate/90
表示视频截图。
CDN加速
融合CDN加速的功能有:缓存刷新(包括文件刷新和目录刷新)、文件预取、获取流量带宽、获取日志下载链接、生成时间戳防盗链,下面分别是对应的示例。
文件刷新
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 缓存刷新
/// </summary>
public void CdnRefresh()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
string[] urls = new string[] { "http://yourdomain.bkt.clouddn.com/somefile.php" };
var result = cdnManager.RefreshUrls(urls);
// 或者使用下面的方法
//RefreshRequest request = new RefreshRequest();
//request.AddUrls(urls);
//var result = cdnMgr.RefreshUrlsAndDirs(request);
Console.WriteLine(result);
}
}
}
目录刷新
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 缓存刷新
/// </summary>
public void CdnRefresh()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
string[] dirs = new string[] { "http://yourdomain.bkt.clouddn.com/" };
var result = cdnMgr.RefreshDirs(dirs);
// 或者使用下面的方法
//RefreshRequest request = new RefreshRequest();
//request.AddDirs(dirs);
//var result = cdnMgr.RefreshUrlsAndDirs(request);
Console.WriteLine(result);
}
}
}
文件预取操作
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 文件预取
/// </summary>
public void CdnPrefetch()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
string[] urls = new string[] { "http://yourdomain.clouddn.com/somefile.php" };
var result = cdnMgr.PrefetchUrls(urls);
// 或者使用下面的方法
//PrefetchRequest request = new PrefetchRequest(urls);
//var result = cdnMgr.PrefetchUrls(request);
Console.WriteLine(result);
}
}
}
获取域名流量
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 查询流量
/// </summary>
public void GetFluxData()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
FluxRequest request = new FluxRequest();
request.StartDate = "2016-09-01";
request.EndDate = "2016-09-02";
request.Granularity = "day";
request.Domains = "DOMAIN1;DOMAIN2";
var result = cdnMgr.GetFluxData(request);
Console.WriteLine(result);
}
}
}
获取域名带宽
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 查询带宽
/// </summary>
public void GetBandwidthData()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
BandwidthRequest request = new BandwidthRequest();
request.StartDate = "2016-09-01";
request.EndDate = "2016-09-20";
request.Granularity = "day";
request.Domains = "yourdomain.bkt.clouddn.com;yourdomain2;yourdomain3";
var result = cdnMgr.GetBandwidthData(request);
Console.WriteLine(result);
}
}
}
获取日志列表
可以获取一个或多个域名在某一天的日志列表(下载链接),参考如下示例:
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 查询日志
/// </summary>
public void GetCdnLogList()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
LogListRequest request = new LogListRequest();
request.Day = "2016-09-01"; // date:which-day
request.Domains = "DOMAIN1;DOMAIN2"; // domains
var result = cdnMgr.GetCdnLogList(request);
Console.WriteLine(result);
}
}
}
构建时间戳防盗链访问链接
using System;
using Qiniu.Util;
using Qiniu.CDN;
using Qiniu.CDN.Model;
namespace CSharpSDKExamples
{
public class FusionDemo
{
/// <summary>
/// 生成时间戳防盗链接
/// </summary>
public void HotLink()
{
// 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey
// 实际应用中,请自行设置您的AccessKey和SecretKey
Mac mac = new Mac(Settings.AccessKey, Settings.SecretKey);
CdnManager cdnMgr = new CdnManager(mac);
TimestampAntiLeechUrlRequest request = new TimestampAntiLeechUrlRequest();
request.Host = "http://your-host";
request.Path = "/path/";
request.File = "file-name";
request.Query = "?version=1.1";
request.SetLinkExpire(600); // 设置有效期,单位:秒
string prefLink = cdnMgr.CreateTimestampAntiLeechUrl(request);
Console.WriteLine(prefLink);
}
}
}
使用案例
在QSunSync和qiniulab这两个工具中,都用到了此SDK,研究它们的源代码也能帮助您更好地了解此SDK:
QSunSync,图形界面同步工具(Windows)
QiniuLab,图像界面实验工具,不用编写繁复的代码就可以测试七牛云的多项服务(Windows)
API参考手册
常见问题
更多使用方法。可以参考QiniuTests下的示例。
问题排查。在SDK的大多函数中(如果有)响应消息,可以反馈给我们进行问题排查。
相关资源
如果您有任何关于我们文档或产品的建议和想法,欢迎到我们的技术论坛参与讨论。
技术论坛 - 在这里您可以和其他开发者愉快的讨论如何更好的使用七牛云服务
提交工单 - 如果您的问题不适合在论坛讨论或得不到回答,您也可以提交一个工单,技术支持人员会尽快回复您
博客 - 这里会持续发布市场活动和技术分享文章
贡献代码
Fork
创建您的特性分支 git checkout -b my-new-feature
提交您的改动 git commit -am 'Added some feature'
将您的修改记录提交到远程 git 仓库 git push origin my-new-feature
然后到 github 网站的该 git 远程仓库的 my-new-feature 分支下发起 Pull Request
许可证
Copyright (c) 2017 qiniu.com
基于 MIT 协议发布: