欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

C# 调用腾讯云 OBJECT API 向对象存储上传文件

最编程 2024-03-17 07:59:17
...

一个C#开发的项目需要把文件上传到腾讯云的存储,以为是一个小CASE,用他的SDK呗,查了半天腾讯云对象存储的SDK,提供了C,C++,JAVA,Android,PHP,PYTHON几乎有所主流语言的SDK,就是没有C#的,咨询官方确认没有提供,不知道是不是语言歧视,看来只有看看他的API能不能搞;

看了下PUT Object API,官方描述:“PUT Object 接口请求可以将本地的对象(Object)上传至指定存储桶中”。貌似这个能上传,但官方只有参数说明,没有示例,看来只有自已摸索,最麻烦的是上传需要签名,需要自已写一个生成签名的服务,生成签名的服务流程如下:

流程图

还有,另一个同事把签名的服务搞了,但还有个麻烦事,官方提供的请求参数中签名的“Authorization”是不带认证类型,如下:

在C#中用HttpClient工具类不能直接通过Headers.Add的方式加Authorization键值对,必须指定认证类型,但指定认证类型后,调用不成功,只有换一个工具类HttpWebRequest,可以把Authorization调Headers.Add(header.Key, header.Value)添加;终于折腾成功~

我只需要请求获取,最终上传部分代码如下:

 

        public string UploadFile(byte[] filestream, SignatureOutput signature)
        {
            var url =
                $"https://{signature.bucket}.cos.{signature.region}.myqcloud.com{signature.path}";
            var headers =
                new Dictionary<string, string> {{"Authorization", signature.signature}, {"ETag", signature.md5}};
            var result = WebApiFactory.CosApiProxy.Put(url, "", headers, filestream);
            if (result)
            {
                return url;
            }
            else
            {
                return ”";
            }
        }

 

 

        public bool Put(string url, string param, Dictionary<string, string> headers, byte[] filestream, string contentType = "application/octet-stream")
        {
            var client = (HttpWebRequest)WebRequest.Create(url);
            foreach (var header in headers)
            {
                client.Headers.Add(header.Key, header.Value);
            }
            client.Method = "PUT";
            client.ContentType = contentType;
            client.ContentLength = filestream.Length;
            client.GetRequestStream().Write(filestream, 0, filestream.Length);
            var response = (HttpWebResponse)client.GetResponse();
            return response.StatusCode == HttpStatusCode.OK;
        }