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

于是自己写了个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算法转的,代码如下:

 /// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}

三、实现curl上传

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

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

  废话不多直接上代码

 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using SeasideResearch.LibCurlNet; namespace BaiduCloudStorage
{
class Program
{
static void Main(string[] args)
{
string flag = "MBO";
string accessKey = "83ee44XXXX0799394e9fXXXXa731XXXX";
string secrectKey = "0Aa2XXXXdff516c44XXXX9e1ef0XXXX1";
string bucket = "sitefiles", sobject = "Media/80cb39dbb6fd526694279e79aa18972bd407364a.jpg";
string content = flag + "\n";
content += "Method=PUT\n";
content += "Bucket=sitefiles\n";
content += "Object=/" + sobject + "\n";
//content += "Ip=115.173.192.3\n";
//content += "Time=2014-01-13\n";
//content += "Size=1024\n"; // B字节 string signture = flag + ":" + accessKey + ":" + HttpUtility.UrlEncode(hmacSha1(content, secrectKey));
string url = "http://bcs.duapp.com/" + bucket + "/" + HttpUtility.UrlEncode(sobject) + "?sign=" + signture; FileStream fs = new FileStream(@"D:\Media\9e1e73600c338744337ee82c500fd9f9d62aa0e6.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); try
{
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); Easy easy = new Easy();
Easy.ReadFunction rf = new Easy.ReadFunction(OnReadData);
easy.SetOpt(CURLoption.CURLOPT_READFUNCTION, rf);
easy.SetOpt(CURLoption.CURLOPT_READDATA, fs); Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, url);
easy.SetOpt(CURLoption.CURLOPT_UPLOAD, );
easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length); easy.SetOpt(CURLoption.CURLOPT_VERBOSE, );
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wf); Easy.DebugFunction df = new Easy.DebugFunction(OnDebug);
easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df);
easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true); easy.Perform();
easy.Cleanup();
fs.Close(); Curl.GlobalCleanup(); }
catch (Exception ex)
{
Console.WriteLine(ex);
} Console.ReadKey();
} public static Int32 OnReadData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
FileStream fs = (FileStream)extraData;
return fs.Read(buf, , size * nmemb);
} public static void OnDebug(CURLINFOTYPE infoType, String msg, Object extraData)
{
// Console.WriteLine(msg);
} public static Int32 OnProgress(Object extraData, Double dlTotal, Double dlNow, Double ulTotal, Double ulNow)
{
Console.WriteLine("Progress: {0} {1} {2} {3}", dlTotal, dlNow, ulTotal, ulNow);
return ; // standard return from PROGRESSFUNCTION
} public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
Console.Write(System.Text.Encoding.UTF8.GetString(buf));
return size * nmemb;
} /// <summary>
/// hmacSha1算法加密
/// </summary>
/// <param name="encryptText">加密明文</param>
/// <param name="encryptKey">加密密钥</param>
/// <returns></returns>
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
}
}

至于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. 全球顶级专家为你解读:什么是真正的 DevOps?

    [编者按]本文是 Skytap 内容主编 Noel Wurst 对 DevOps Enterprise Summit (DOES)的不完全综述,内容包括了 Noel 和一些与会嘉宾的思考,旨在勾画 D ...

  2. 【POJ2778】AC自动机+矩阵乘法

    DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14758 Accepted: 5716 Descrip ...

  3. StringGrid右击选中表格(发消息给句柄模拟点击,右键点击也是MouseDown)

    顺便还把单元格给变了: procedure TFGLGL.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShi ...

  4. Java ftp断点续传

    FtpTransFile类 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  5. bzoj2007

    首先不难发现海拔高度只能为0或1 因为决策是单调的 不难发现最优决策一定是划分为海拔为0和1两块,不会出现01相间的情况 所以这很明显是一个最小割 由于n*n很大,我们必须要用平面图最小割转化为最短路 ...

  6. 支付宝APP支付(Java后台生成签名具体步骤)

    /** *支付宝支付 * @param orderId 订单编号 * @param actualPay 实际支付金额 * @return */ private String getOrderInfoB ...

  7. 【传】玩转Android---UI篇---ImageButton(带图标的按钮)

    原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...

  8. 宁波Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. Domino - SGU 101 (欧拉路径)

    题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’), ...

  10. 自己生成非官方iPhone toolchain的头文件

    如果你已经搭建好非官方iPhone toolchain开发包,如果缺少某些头文件,可以用以下方法自己生成. 首先下载class-dump: http://www.codethecode.com/pro ...