因前几日见园子里有人说可以把网站静态文件放在百度上,于是去百度开放平台看了看,发现之前那篇文章不是调的云存储接口啊。。。

于是自己写了个C#能调百度云存储的例子(百度云开放平台只提供php、java、Python、c++),下面贴一下步骤和代码,还请多多指点啊!

一、libcurl.NET

百度提供的四种途径我们选择的是curl方式,但是大家都知道curl需要linux环境支持,这里引用了国外的libcurl.NET开源项目。下载最新版本的libcurlnet-1_3.zip,解压后将这(ca-bundle.crt、libcurl.dll、LibCurlNet.dll、LibCurlShim.dll)四个文件放在你自己项目的bin目录下。

然后项目里添加LibCurlNet.dll引用。

二、签名算法

百度的URL签名算法说是用的sha1加密,千万别理解错!这里我是从php的hash_hmac算法转的,代码如下:

  1. /// <summary>
  2. /// hmacSha1算法加密
  3. /// </summary>
  4. /// <param name="encryptText">加密明文</param>
  5. /// <param name="encryptKey">加密密钥</param>
  6. /// <returns></returns>
  7. public static string hmacSha1(string encryptText, string encryptKey)
  8. {
  9. HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
  10. byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
  11. return Convert.ToBase64String(RstRes);
  12. }

三、实现curl上传

其实就是要将下面这段命令翻译成C#

  1. curl -T bs.txt -v
  2. "http://bcs.duapp.com/bucket/testobject?sign=MBO:f:PVaOdaf%2BxNoC7aXRqL%2FJq5Kp7a4%3D"

  废话不多直接上代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Web;
  8. using SeasideResearch.LibCurlNet;
  9.  
  10. namespace BaiduCloudStorage
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. string flag = "MBO";
  17. string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX";
  18. string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1";
  19. string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg";
  20. string content = flag + "\n";
  21. content += "Method=PUT\n";
  22. content += "Bucket=sitefiles\n";
  23. content += "Object=/" + sobject + "\n";
  24. //content += "Ip=115.173.192.3\n";
  25. //content += "Time=2014-01-13\n";
  26. //content += "Size=1024\n"; // B字节
  27.  
  28. string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey));
  29. string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture;
  30.  
  31. FileStream fs = new FileStream(@"D:\Media\9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
  32.  
  33. try
  34. {
  35. Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
  36.  
  37. Easy easy = new Easy();
  38. Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData);
  39. easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf);
  40. easy.SetOpt(CURLoption.CURLOPT_READDATA, fs);
  41.  
  42. Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
  43. easy.SetOpt(CURLoption.CURLOPT_URL, url);
  44. easy.SetOpt(CURLoption.CURLOPT_UPLOAD, );
  45. easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length);
  46.  
  47. easy.SetOpt(CURLoption.CURLOPT_VERBOSE, );
  48. easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf);
  49.  
  50. Easy.DebugFunction df = new Easy.DebugFunction(OnDebug);
  51. easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df);
  52. easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true);
  53.  
  54. easy.Perform();
  55. easy.Cleanup();
  56. fs.Close();
  57.  
  58. Curl.GlobalCleanup();
  59.  
  60. }
  61. catch (Exception ex)
  62. {
  63. Console.WriteLine(ex);
  64. }
  65.  
  66. Console.ReadKey();
  67. }
  68.  
  69. public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
  70. {
  71. FileStream fs = (FileStream)extraData;
  72. return fs.Read(buf, , size * nmemb);
  73. }
  74.  
  75. public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData)
  76. {
  77. // Console.WriteLine(msg);
  78. }
  79.  
  80. public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow)
  81. {
  82. Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow);
  83. return ; // standard return from PROGRESSFUNCTION
  84. }
  85.  
  86. public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
  87. {
  88. Console.Write(System.Text.Encoding.UTF8.GetString(buf));
  89. return size * nmemb;
  90. }
  91.  
  92. /// <summary>
  93. /// hmacSha1算法加密
  94. /// </summary>
  95. /// <param name="encryptText">加密明文</param>
  96. /// <param name="encryptKey">加密密钥</param>
  97. /// <returns></returns>
  98. public static string hmacSha1(string encryptText, string encryptKey)
  99. {
  100. HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
  101. byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
  102. return Convert.ToBase64String(RstRes);
  103. }
  104. }
  105. }

至于libcurl.NET具体咋用,我这儿真没什么资料,都谷歌上查的,兄弟们有相关资料的给留个地址啊,我这还想继续完善完善啊。。。

C#调用百度云存储接口上传文件的更多相关文章

  1. 使用python或robotframework调multipart/form-data接口上传文件

    这几天调一个multipart/form-data类型的接口,遇到点小阻碍.之前同事有使用urllib库写了个类似的方法实现,比较长,想要改的时候发现不太好使.在网上查找发现用requests库做这个 ...

  2. 使用RestTemplate调用接口上传文件

    场景 接口接受一个文件,缓存在本地,验证文件的完整性及内容,然后将文件上传至云服务器: 下面只写利用RestTemplate将文件上传至云服务器,至于文件上传以及缓存在本地可以参考:JAVA文件上传: ...

  3. java 调用Spring接口上传文件及其他参数填充

    第一步:在Spring配置中添加以下内容 <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMultipartResolver --> < ...

  4. Jmeter接口上传文件

    一.使用抓包软件抓取该接口,查看参数(图例使用的是charles) 可以看到上传文件的参数名是file1 二.把抓取到的普通参数都放在参数这一栏里,如图所示,不要在意马赛克 三.参数名称写在如图所示的 ...

  5. C# 使用HttpWebRequest通过PHP接口 上传文件

    1:上传文件实例 public void UploadXMLLog(string xmlpath)         {             NameValueCollection nvc = ne ...

  6. Android、iOS与Servlet接口上传文件和JSON串的交互

    package etcom.servlet; import java.io.File; import java.io.IOException; import java.sql.Connection; ...

  7. 阿里云对象存储oss上传文件夹

    最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的大文件传输功能做出分析,怎么实现文件夹上传的,如 ...

  8. 阿里云OSS图片云存储测试上传

    在开发DEMO之前首先要确定 你开发OSS服务并获取了 accessKeyId和accessKeySecret final String key = MD5.Md5(DateFormat.format ...

  9. 阿里云oss怎么上传文件夹

    最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...

随机推荐

  1. 在CENTOS6上安装MONGODB

    为接下来的工作热一下手.. 以前看过一本书,了解了,但好像有三四年,又忘了..:( 参考URL: http://www.centoscn.com/image-text/install/2014/112 ...

  2. 我所理解的OOP——UML六种关系(转)

    转自:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了, ...

  3. Innodb和MyISAM比较

    Innodb和MyISAM比较 (1)MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快 (2)MyISAM不支持事务.外键,InnoDB支持事务和外键 (3)MyISAM使用的表级锁 ...

  4. 重构第四天 : 用多态替换条件语句(if else & switch)

    面相对象的一个核心基础就是多态,当你要根据对象类型的不同要做不同的操作的时候,一个好的办法就是采用多态,把算法封装到子类当中去. 重构前代码: public abstract class Custom ...

  5. poj1150

    这道题告诉我们递推一定要慢慢细细的推Pmn=n!/m!,我们可以先考虑n!的最后一位是什么首先最后一位非0位我们首先想到把0都干掉也就是先把2和5提出来,这两个其实是同样的方法对于N!中有多少个因数2 ...

  6. [SSD大法好]神舟K480-I5-D3鸟枪换炮M6S

    Hello,SSD 期盼已久,终于入手了M6S的256G固态硬盘,白天就不安生一直百度.谷歌.必应,势必要把所有相关消息查个清楚这神舟K480I5D3怎生拆呢. 最后心里隐约有了安装的法门. 但到得开 ...

  7. leetcode distinct-subsequences(DP)

    参考https://oj.leetcode.com/problems/distinct-subsequences 动态规划方程 dp[i][j]=dp[i-1][j-1]+dp[i-1][j] (s( ...

  8. C_FORCE_ROOT linux环境变量设置

    nano /etc/profile     gedit 也可以 结尾追加 export C_FORCE_ROOT="true"

  9. weekend110(Hadoop)的 第六天笔记

    (2015年1月25日) 课程目录 01-复习ha相关 02-hive的元数据库mysql方式安装配置 03-hive的使用 04-hive的常用语法 05-hql语法及自定义函数 06-hbase表 ...

  10. Linux2.6内核--中断线被关闭的情况

          中断系统是现代操作系统中不可获取的一个子系统,它由硬件主动触发并发送到CPU,最后由内核调用中断处理程序处理中断.       那么中断有时候需要关闭,这是为什么呢?       一般分为 ...