因前幾日見園子里有人說可以把網站靜態文件放在百度上,於是去百度開放平台看了看,發現之前那篇文章不是調的雲存儲接口啊。。。
於是自己寫了個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#
curl -T bs.txt -v "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, 1); 45 easy.SetOpt(CURLoption.CURLOPT_INFILESIZE, fs.Length); 46 47 easy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1); 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, 0, 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 0; // 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具體咋用,我這兒真沒什么資料,都谷歌上查的,兄弟們有相關資料的給留個地址啊,我這還想繼續完善完善啊。。。