• C#调用百度云存储接口上传文件


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

    于是自己写了个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         }
    View Code

    三、实现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 + "
    ";
     21             content += "Method=PUT
    ";
     22             content += "Bucket=sitefiles
    ";
     23             content += "Object=/" + sobject + "
    ";
     24             //content += "Ip=115.173.192.3
    ";
     25             //content += "Time=2014-01-13
    ";
     26             //content += "Size=1024
    "; // 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:Media9e1e73600c338744337ee82c500fd9f9d62aa0e6.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 }
    View Code

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

  • 相关阅读:
    iOS App播放完自己的音视频后,如何重新继续播放后台音乐
    苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法
    Xcode11.1 踩坑备忘录
    foaf
    安卓开发:UI组件-图片控件ImageView(使用Glide)和ScrollView
    安卓开发:UI组件-RadioButton和复选框CheckBox
    安卓开发:UI组件-Button和EditText
    安卓开发:UI组件-布局管理器和文本显示
    基础环境系列:PHP7.3.0并连接pache/IIS和MySQL
    基础环境系列:MySQL8.0.12
  • 原文地址:https://www.cnblogs.com/sheng9hhd/p/3519685.html
Copyright © 2020-2023  润新知