C#使用七牛云存储上传下载文件、自定义回调
项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现。
做了一个简易的压力测试,同时上传多个文件,七牛自己应该有队列处理并发请求,我无论同时提交多少个文件,七牛是批量一个个排队处理了。
一个1.5MB的文件,上传时间大概2-3秒,感觉不错。
直接上代码
using Qiniu.IO; using Qiniu.IO.Resumable; using Qiniu.RPC; using Qiniu.RS; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace qiniuTest {/// <summary>/// 文件上传有两种方式:/// 一种是以普通方式直传文件,简称普通上传;/// 另一种方式是断点续上传,断点续上传在网络条件很一般的情况下也能有出色的上传速度,而且对大文件的传输非常友好。/// </summary>class Program{static string bucket = "cvteXXXX";static void Main(string[] args){Qiniu.Conf.Config.ACCESS_KEY = "6QQ7Cnz4bljdkQOWQ5UOAheVCAd0bCa7Tc5XXXXX";Qiniu.Conf.Config.SECRET_KEY = "9rUGnbFtvm-PLWcZeOR6ed9MUjZ4bKitf7YXXXX";string fileKey = "应用系统全貌图.png";//GetFileStat(bucket, fileKey);//小文件直传string fileName = "CVTE信息系统-业务功能架构图-IM和企业微信.jpg";//PutFile(bucket, Guid.NewGuid().ToString() + fileName, "d:\\" + fileName);//在asp.net mvc中的文件上传//ResumablePutFile(bucket, Guid.NewGuid().ToString(), Path.Combine(path, Request.Form[0]));//大文件上传//string bigFileName = "eclipse-java-luna-SR1-win32-x86_64.zip";//ResumablePutFile(bucket, Guid.NewGuid().ToString() + bigFileName, "d:\\Software\\" + bigFileName);//GetFile("7xq1c1.com1.z0.glb.clouddn.com", fileKey);//********************** 压力测试 **********************// 获取线程池的最大线程数和维护的最小空闲线程数int maxThreadNum, portThreadNum;int minThreadNum;ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);Console.WriteLine("最大线程数:{0}", maxThreadNum);Console.WriteLine("最小空闲线程数:{0}", minThreadNum);int loopNumber = 1; //内部循环次数int ConcurrentNumber = 10; //并发数for (int i = 0; i < ConcurrentNumber; i++){ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), loopNumber);}Console.ReadLine();}public static void TaskProc(object loopNumber){int LoopNumber = Convert.ToInt32(loopNumber);Console.WriteLine("启动任务,小文件直传");//小文件直传 压力测试for (int i = 0; i < LoopNumber; i++){string fileName = "WinRAR.exe";Console.WriteLine(i + "开始" + fileName + System.DateTime.Now);PutFile(bucket, Guid.NewGuid().ToString() + fileName, "D:\\" + fileName);Console.WriteLine(i + "完成" + fileName + System.DateTime.Now);string fileName1 = "WinRAR1.exe";Console.WriteLine(i + "开始" + fileName1 + System.DateTime.Now);PutFile(bucket, Guid.NewGuid().ToString() + fileName1, "D:\\" + fileName1);Console.WriteLine(i + "完成" + fileName1 + System.DateTime.Now);}}/// <summary>/// 查看单个文件属性信息/// </summary>/// <param name="bucket">七牛云存储空间名</param>/// <param name="key">文件key,也就是文件名</param>public static void GetFileStat(string bucket, string key){RSClient client = new RSClient();Entry entry = client.Stat(new EntryPath(bucket, key));if (entry.OK){Console.WriteLine("Hash: " + entry.Hash);Console.WriteLine("Fsize: " + entry.Fsize);Console.WriteLine("PutTime: " + entry.PutTime);Console.WriteLine("MimeType: " + entry.MimeType);Console.WriteLine("Customer: " + entry.Customer);}else{Console.WriteLine("Failed to Stat");}}/// <summary>/// 删除单个文件/// </summary>/// <param name="bucket">文件所在的空间名</param>/// <param name="key">文件key</param>public static void Delete(string bucket, string key){Console.WriteLine("\n===> Delete {0}:{1}", bucket, key);RSClient client = new RSClient();CallRet ret = client.Delete(new EntryPath(bucket, key));if (ret.OK){Console.WriteLine("Delete OK");}else{Console.WriteLine("Failed to delete");}}/// <summary>/// 批量删除文件/// </summary>/// <param name="bucket">文件所在的空间名</param>/// <param name="keys">文件key</param>public static void BatchDelete(string bucket, string[] keys){RSClient client = new RSClient();List<EntryPath> EntryPaths = new List<EntryPath>();foreach (string key in keys){Console.WriteLine("\n===> Stat {0}:{1}", bucket, key);EntryPaths.Add(new EntryPath(bucket, key));}client.BatchDelete(EntryPaths.ToArray());}/// <summary>/// 普通方式直传文件/// </summary>/// <param name="bucket">文件所在的空间名</param>/// <param name="key">您可以自行定义文件Key,一般GUID</param>/// <param name="fname">文件路径+文件名</param>public static void PutFile(string bucket, string key, string fname){var policy = new PutPolicy(bucket, 3600);string upToken = policy.Token();PutExtra extra = new PutExtra();IOClient client = new IOClient();client.PutFile(upToken, key, fname, extra);}/// <summary>/// 断点续上传方式,传大文件用这种方式/// </summary>/// <param name="bucket">文件所在的空间名</param>/// <param name="key">您可以自行定义文件Key,一般GUID</param>/// <param name="fname">文件路径+文件名</param>public static void ResumablePutFile(string bucket, string key, string fname){Console.WriteLine("\n===> ResumablePutFile {0}:{1} fname:{2}", bucket, key, fname);PutPolicy policy = new PutPolicy(bucket, 3600);string upToken = policy.Token();Settings setting = new Settings();ResumablePutExtra extra = new ResumablePutExtra();ResumablePut client = new ResumablePut(setting, extra);client.PutFile(upToken, fname, Guid.NewGuid().ToString());}/// <summary>/// Get方式获取文件/// </summary>/// <param name="domain">文件域</param>/// <param name="key">文件Key</param>public static void GetFile(string domain, string key){System.Diagnostics.Process.Start("http://" + domain + "/" + key);}} }
另外,七牛的魔法变量非常强大,多用于增强回调
魔法变量
魔法变量是一组预先定义的变量,可以使用 $(var)
或 $(var.field_name)
形式求值。
目前可用的魔法变量如下:
变量名 | 包含子项 | 变量说明 | 适用范围 |
bucket | 获得上传的目标空间名。 | ||
key | 获得文件保存在空间中的资源名。 | ||
etag | 文件上传成功后的HTTP ETag。若上传时未指定资源ID,Etag将作为资源ID使用。 | ||
fname | 上传的原始文件名。 |
不支持用于分片上传
|
|
fsize | 资源尺寸,单位为字节。 | ||
mimeType |
资源类型,比如JPG图片的资源类型为image/jpg 。
|
||
endUser |
上传时指定的endUser 字段,通常用于区分不同终端用户的请求。
|
||
persistentId | 音视频转码持久化的进度查询ID。 | ||
exif | 是 |
获取所上传图片的Exif信息。
该变量包含子字段,比如对 |
暂不支持用于saveKey 中
|
imageInfo | 是 |
获取所上传图片的基本信息。
该变量包含子字段,比如对 |
暂不支持用于saveKey 中
|
year | 上传时的年份。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
mon | 上传时的月份。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
day | 上传时的日期。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
hour | 上传时的小时。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
min | 上传时的分钟。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
sec | 上传时的秒钟。 | 暂不支持用于’returnBody’、’callbackBody’中 | |
avinfo | 是 | 音视频资源的元信息。 | 暂不支持用于’saveKey’中 |
imageAve | 图片主色调,算法由Camera360友情提供。 | ||
ext | 上传资源的后缀名,通过自动检测的 mimeType 或者原文件的后缀来获取。 |
不支持用于分片上传
|
|
uuid | 生成uuid | 暂不支持用于’saveKey’中 | |
bodySha1 | callbackBody的sha1(hex编码) | 只支持用于’callbackUrl’中 |
魔法变量支持$(<Object>.<Property>)
形式的访问子项,例如:
- $(<var>)
- $(<var>.<field_name>)
- $(<var>.<field_name>.<sub_field_name>)
求值举例:
$(bucket)
- 获得上传目标bucket名字$(imageInfo)
- 获取当前上传图片的基本属性信息$(imageInfo.height)
- 获取当前上传图片的原始高度
回调通知(callback)
可以设置上传策略(PutPolicy)中的callbackUrl
字段,并且设置callbackBody
字段。
“自定义回调”具体实现
/// <summary>/// 文件上传后的自定义回调/// </summary>/// <param name="bucket">文件所在的空间名</param>/// <param name="key">您可以自行定义文件Key,一般GUID</param>/// <param name="fname">文件路径+文件名</param>public static PutRet PutFile(string bucket, string key, string fname){var policy = new PutPolicy(bucket, 3600);policy.ReturnBody = "{\"key\": $(key), \"hash\": $(etag), \"extra\": $(x:extra), \"callbackUrl\": $(x:callbackUrl)}";//policy.CallBackBody = "name=$(fname)&location=$(x:location)&price=$(x:price)";//policy.CallBackUrl = "http://ip/url";string upToken = policy.Token();PutExtra extra = new PutExtra(); //扩展属性Dictionary<string,string> dict =new Dictionary<string,string>();dict.Add("x:extra", "location=shanghai&age=28");dict.Add("x:callbackUrl", "http://127.0.0.1/callback");extra.Params = dict;IOClient client = new IOClient();return client.PutFile(upToken, key, fname, extra);}
完整源代码下载 :source code
C#使用七牛云存储上传下载文件、自定义回调相关推荐
- php上传视频到七牛云并切片转m3u8,在七牛云存储上播放 HLS
在七牛云存储上播放 HLS HLS 是在移动端使用广泛的播放协议,可以用于直播,也可以用于点播.七牛云存储提供多种类型的视频文件向 HLS 的转换功能:音视频切片.同时,也提供了 m3u8 和 ts ...
- 记录vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn的过程
前言:vue-cli2打包项目静态文件夹static到七牛云存储上,并使用七牛云融合cdn 1.前期准备 npm install --save jsonfile jsonfile扩展说明文档 npm ...
- java 上传文件及预览_SpringBoot上传下载文件及在线预览
SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...
- SpringBoot上传下载文件及在线预览
SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...
- linux上很方便的上传下载文件工具rz和sz
linux上很方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) ######################################################### # ...
- 上传下载文件实例(vsftp服务器+nginx)
上传下载文件实例(vsftp服务器+nginx) 页面(上传+下载) <form action="/pic/upload" enctype="multipart/f ...
- 支持国产ARM64架构部署,支持使用rz、sz命令上传下载文件,JumpServer堡垒机v2.12.0发布
支持国产ARM64架构部署,JumpServer堡垒机v2.12.0发布 7月19日,JumpServer开源堡垒机正式发布v2.12.0版本.在这一版本中,JumpServer新增支持ARM64架构 ...
- android ftp同步程序,ftp同步 安卓,安卓手机ftp上传下载文件功能同步视频照片
手机拍照越来方便,手机里的照片也越积越多,手机运行缓慢,本文利用安卓的每步FTP服务APP来自动实现手机视频照片的同步,释放手机被占用的存储空间.在机顶盒上运行每步FTP服务,机顶盒USB口连接U盘做 ...
- 前端js华为云obs上传下载文件与进度条的设置
前端js华为云obs上传下载文件与进度条的设置 首先下载OBS BrowserJS SDK安装包 用git将代码拉到本地 git clone https://github.com/huaweiclou ...
最新文章
- jQuery学习---------认识事件处理
- 老段mysql,老段视频汇总
- php zip压缩命令,php zip压缩文件
- domain,DNS,冗余,DNS劫持的大致原理
- jQuery插件-json2.js
- 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】
- android中止线程_Android如何结束并重启线程? | 学步园
- 仅30分钟,在同一台设备安装discourse和wordpress
- MySQL之User(用户)和Privilege(权限)
- Python高手之路【十】python基础之反射
- C# WPF 多个window 相互覆盖的次序控制 不用topmost
- 360软件管家android,360软件管家
- 为 Perl 定制 Vim
- 以太网交换机erps学习记录
- javaweb后台管理系统
- 如何用一个例子彻底解释白盒测试中语句覆盖、判定覆盖、条件覆盖、条件判定覆盖、条件组合覆盖?
- 戴尔r410服务器虚拟磁盘,DELL服务器R410原装 SAS 6/IR RAID卡 阵列控制器卡 支持RAID0,1...
- CTF-BeesCMS系统漏洞分析溯源
- 谈谈This对象的理解
- vue自适应多行文本
热门文章
- 对外经贸大学计算机应用基础,对外经贸大学计算机应用基础试题.doc
- 试卷8449c 语言,二级C语言上机题库参考答案
- php io流 读取wav,记php中的io流---帮助理解
- mysql查询后调用mysql_free_result_怎么释放_关于mysql_free_result和mysql_close的解惑
- 对java这门课程的认识_关于java课程的总结
- html浏览器边框颜色,CSS设置字体和边框颜色时Chrome和其他主流浏览器差别的问题_html/css_WEB-ITnose...
- log4j平稳升级到log4j2
- ueditor的配置和使用
- 电子商务专业需要考计算机证吗,电子商务必考的证有哪些
- outlook反应慢的原因_保险管怎么区分慢熔和快熔?