C#封装v5 COS API实践-put方法

接get方法后,提供V5 COS API封装put方法,用于文件的上传操作。

//1.参数定义
string SecretId = "这里输入您的SecretId";//SecretId替换成自己的
string SecretKey = "这里输入您的SecretKey";//SecretKey替换成自己的

string q_sign_algorithm = "sha1";
string q_ak = SecretId;
string q_sign_time = GetTimeStamp(DateTime.UtcNow) + ";" + GetTimeStamp(DateTime.UtcNow.AddHours(1));//签名有效期1个小时
string q_key_time = GetTimeStamp(DateTime.UtcNow) + ";" + GetTimeStamp(DateTime.UtcNow.AddHours(1));//签名有效期1个小时;
string q_header_list = "";
string q_url_param_list = "";
string q_signature = "";

string key = "/1.jpg";//上传的object名称为1.jpg
string method = "put";

//2.签名计算
string SignKey = ComputeHash(Encoding.ASCII.GetBytes(SecretKey), q_key_time);//对签名的有效起止时间加密计算值SignKey
string HttpString = method+"\n" + key + "\n\n\n";//根据固定格式组合生成
string StringToSign = q_sign_algorithm+"\n"+ q_sign_time + "\n"+ GetSH1(HttpString) + "\n";//加密 HttpString,并根据固定格式组合生成 StringToSign
string Signature = ComputeHash(Encoding.ASCII.GetBytes(SignKey), StringToSign);//加密 StringToSign,生成 Signature

string url = "http://{bucket}-{appid}.cos.ap-beijing.myqcloud.com" + key + "?q-sign-algorithm=" + q_sign_algorithm + "&q-ak=" + q_ak + "&q-sign-time=" + q_sign_time + "&q-key-time=" + q_key_time + "&q-header-list=&q-url-param-list=&q-signature=" + Signature;//把{bucket}  {appid} 都替换成自己的
string data = "123456";

//3.上传对象
try
{
    Put(url, data);
    Response.Write("put上传完成");
}
catch (Exception ex)
{
    Response.Write("put上传失败:" + ex.Message);
}
//4.工具方法
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp(DateTime dt)
{
    TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 计算哈希
/// </summary>
/// <param name="key"></param>
/// <param name="input"></param>
/// <returns></returns>
public static string ComputeHash(byte[] key, string input)
{
    HMACSHA1 myhmacsha1 = new HMACSHA1(key);
    byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(input);
    MemoryStream stream = new MemoryStream(byteArray);
    return myhmacsha1.ComputeHash(stream).Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
}
/// <summary>
/// SHA1
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetSH1(string value)
{
    SHA1 algorithm = SHA1.Create();
    byte[] data = algorithm.ComputeHash(Encoding.UTF8.GetBytes(value));
    string sh1 = "";
    for (int i = 0; i < data.Length; i++)
    {
        sh1 += data[i].ToString("x2").ToLower();
    }
    return sh1;
}

#region Put方式
private static string Put(string url, string data)
{
    return CommonHttpRequest(url, "PUT", data);
}
#endregion
#region  私有方法
private static string CommonHttpRequest(string url, string type, string data = "")
{
    HttpWebRequest myRequest = null;
    Stream outstream = null;
    HttpWebResponse myResponse = null;
    StreamReader reader = null;
    try
    {
        //构造http请求的对象
        myRequest = (HttpWebRequest)WebRequest.Create(url);


        //设置
        myRequest.ProtocolVersion = HttpVersion.Version10;
        myRequest.Method = type;

        if (data.Trim() != "")
        {
            myRequest.ContentType = "text/xml";
            myRequest.ContentLength = data.Length;

            //转成网络流
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);

            outstream = myRequest.GetRequestStream();
            outstream.Flush();
            outstream.Write(buf, 0, buf.Length);
            outstream.Flush();
            outstream.Close();
        }
        // 获得接口返回值
        myResponse = (HttpWebResponse)myRequest.GetResponse();
        reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
        string ReturnXml = reader.ReadToEnd();
        reader.Close();
        myResponse.Close();
        myRequest.Abort();
        return ReturnXml;
    }
    catch (Exception ex)
    {
        // throw new Exception();
        if (outstream != null) outstream.Close();
        if (reader != null) reader.Close();
        if (myResponse != null) myResponse.Close();
        if (myRequest != null) myRequest.Abort();
        return ex.Message;
    }
}
#endregion

抓包看下,上传成功。

以下是原始代码

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

TFS2018环境搭建一硬件要求

TFS可以安装在Windows Server和Windows PC操作系统中,但是TFS2018和2018只支持64位操作系统中,早期的版本没有操作系统的位数限...

41030
来自专栏Python专栏

200行代码,一行行教你自制微信机器人

1) 用一个windows客户端工具运营公众号,真的很局限。虽然工具的功能很强大,能自动添加好友,自动拉好友入群,关键字回复等等,但是有一个绕不开的点,它是一款...

62120
来自专栏苦逼的码农

一些常用的算法技巧总结

数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些...

21530
来自专栏张叔叔讲互联网

QQ如何把你消息传递给好友的?(下篇)

话说你已经成功注册了QQ号码,取名叫“村头小伙”。你的同学小芳“村里那个姑娘”也接受了你的好友申请。之后的日子里面,你们经常通过QQ发送文字和语音,偶尔还会视频...

11720
来自专栏张叔叔讲互联网

当妈妈在淘宝购物的时候,都发生了什么?(下篇)

在上一篇文章中,讲到了你的妈妈成功从你手中夺得了电脑的控制权,然后打开了淘宝网并且在网站首页搜索框中搜索了“美丽的裙子”,之后用一种挑剔的眼光盯着电脑屏幕一个多...

16440
来自专栏数据结构笔记

python基础类型(一):字符串和列表

注意到最后三个的单双引号是嵌套使用的,但是最后一个的使用方法是错误的,因为当我们混合使用两种引号时必须有一种用来划分字符串的边界,即在两边的引号不能出现在字符串...

13920
来自专栏码农分享

3.2、苏宁百万级商品爬取 思路讲解 商品爬取

如果我要得到A类别的第B页的商品我应该如何拼接符合条件的地址 我们首先分析地址,地址如下

13630
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:Pattern: Service Mesh

在十几年前,我们无法想象一个分布式系统会是什么样子。它给我们带来了全新的架构思路,但同时也引入了一些问题。 当时这些系统非常少有而且架构简单,工程师们通过尽可能...

22020
来自专栏非著名程序员

不可思议,我们程序员竟然上热搜了

天气转冷,一支神秘而又强大的力量突然重出江湖。他们是一群思维严谨,着装统一(其实就是撞衫),腰别键盘,双肩背包的人。这股神秘而又庞大的力量充斥在江湖的一线和二线...

12430
来自专栏smy

一张图解释负载均衡

首先当大量用户访问时候,先请求到nignx服务器,因为nignx对于高并发支持较好,所以由nignx服务器将访问需求分配给不同的apache服务器,apache...

21330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励