OSS签名Header实现Demo(C#)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: OSS的集成上传和下载提供了SDK可以直接使用,但实际使用中一些用户受限环境或者设备限制需要使用api方式来实现上传和下载,本文以PutObject接口为例,提供了C#实现的demo。

概述
OSS的集成上传和下载提供了SDK可以直接使用,但实际使用中一些用户受限环境或者设备限制需要使用api方式来实现上传和下载,本文以PutObject接口为例,提供了C#实现的demo。
注:建议优先使用OSS提供SDK,本文提供的只是签名实现上传demo,实际使用中需要结合业务来进行改动代码
详细信息
PutObject实现demo(visual studio 2017,NET Framework4.0)

using System;

using System.Security.Cryptography;

using System.Text;

using System.Net;

using System.IO;

using System.Reflection;



namespace Aliyun.OSS.Samples

{

    class Program

    {





        //您的AccessKey

        public static string AccessKey = "xx";

        //您的 AccessKeySecret

        public static string AccessKeySecret = "xx";

        //bucket所在的endpoint

        public static string Endpoint = "oss-cn-hangzhou.aliyuncs.com";

        public static string BucketName = "xx";

        public static string objectName = "mytest/1.txt";

        public static string HmacSha1Sign(string secret, string strOrgData)

        {

            var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret));

            var dataBuffer = Encoding.UTF8.GetBytes(strOrgData);

            var hashBytes = hmacsha1.ComputeHash(dataBuffer);

            return Convert.ToBase64String(hashBytes);

        }



        public static string HttpRequest(string url, string data, string sign, string contentType, string time1)

        {



            byte[] datas = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            request.Method = "PUT";

            request.Timeout = 150000;

            request.Headers.Add("Authorization", "OSS " + AccessKey + ":" + sign);

            CallPrivateMethod(request, "SetSpecialHeaders", "Date", time1);

            request.ContentType = contentType;

            Stream requestStream = null;

            string responseStr = null;

            try

            {

                if (datas != null)

                {

                    request.ContentLength = datas.Length;

                    requestStream = request.GetRequestStream();

                    requestStream.Write(datas, 0, datas.Length);

                    requestStream.Close();

                }

                else

                {

                    request.ContentLength = 0;

                }

                HttpWebResponse response = request.GetResponse() as HttpWebResponse;

                responseStr = response.Headers.GetValues("x-oss-request-id")[0];

                //responseStr = sr.ReadToEnd();

            }

            catch (Exception)

            {

                Console.WriteLine("error");

            }

            finally

            {

                request = null;

                requestStream = null;

            }

            return responseStr;

        }



        public static string ToGMTString()

        {

            return DateTime.Now.ToUniversalTime().ToString("r");

        }

        public static void CallPrivateMethod(object instance, string name, params object[] param)

        {

            BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;

            Type type = instance.GetType();

            MethodInfo method = type.GetMethod(name, flag);

            method.Invoke(instance, param);

        }



        static void Main(string[] args)

        {



            string varb = "PUT";

            string content_type = "application/json";

            string timeGmt = ToGMTString();

            string str = varb + "\n\n" + content_type + "\n" + timeGmt + "\n/" + BucketName + "/" + objectName;

            string signature = HmacSha1Sign(AccessKeySecret, str);

            string url = "http://" + BucketName + "." + Endpoint + "/" + objectName;

            string data = "{ \"key\":\"this is a oss's test\"}";

            string result = HttpRequest(url, data, signature, content_type, timeGmt);

            Console.WriteLine("requestId:  " + result);
        }

    }

}
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
6月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
1066 1
|
C# 对象存储
C#上传阿里云OSS工具类AliOSSTool
C#上传阿里云OSS工具类AliOSSTool
386 0
|
对象存储
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
497 0
|
6月前
|
存储 安全 API
对象存储OSS产品常见问题之在URL中包含签名如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
275 0
|
6月前
|
DataWorks 算法 对象存储
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
42 2
|
存储 前端开发 JavaScript
Nestjs+Vue实现阿里云OSS服务端签名直传
阿里云 OSS 是常用的对象存储服务,借助其提供的 SDK,客户端(浏览器,小程序等)可以非常方便的将文件上传到 OSS 进行管理。
948 0
Nestjs+Vue实现阿里云OSS服务端签名直传
|
存储 域名解析 安全
Nest 实现OSS 服务端签名直传并设置上传回调
Nest 实现OSS 服务端签名直传并设置上传回调
592 0
|
存储 前端开发 安全
oss服务端签名后直传分析与代码实现
oss服务端签名后直传分析与代码实现
976 0
|
存储 前端开发 Java
四步解决!OSS对象存储文件上传功能(服务端签名后直传,建议收藏)
四步解决!OSS对象存储文件上传功能(服务端签名后直传,建议收藏)
2932 2
四步解决!OSS对象存储文件上传功能(服务端签名后直传,建议收藏)
|
小程序 JavaScript 前端开发
微信小程序:阿里云OSS直传实践-PHP实现服务端签名
微信小程序:阿里云OSS直传实践-PHP实现服务端签名
948 0
微信小程序:阿里云OSS直传实践-PHP实现服务端签名