C# 移动云 obs服务端上传类

移动云卖的多数产品都是来至于华为云的,导致移动云上的文档都要到华为云上查阅,华为云上的帮助文档写的很粗糙,这点应该像微信开发文档学习,经过多天的反复查阅资料写了个OSB上传类分享给大家使用。

using LitJson;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web;

/// <summary>
/// OBS_FileManage 的摘要说明
/// </summary>
public class OBS_FileManage
{
    public static string Access_Key_Id = "*************";
    public static string Secret_Access_Key = "***********";
    public static string Bucket_Name = "you name";//桶名
    public static string Host_Domain = "you Access domain name";//访问域名
    public OBS_FileManage()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //

        
    }
    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="file_name">相对路径/文件名</param>
    /// <param name="file_url">上传文件绝对路径</param>
    /// <returns></returns>
    public static string UploadFile(string file_name,string file_url)
    {
        string expiration = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
        JsonData JD = new JsonData();
        JD["expiration"] = expiration;
        JD["conditions"] = new JsonData();
        JsonData JDinfo = new JsonData();
        JDinfo["bucket"] = "waixiao";
        JDinfo["key"] = file_name;
        JD["conditions"].Add(JDinfo);
        string policy = JD.ToJson();
        string StringToSign = policy.GetBytes().ToBase64String();
        string Signature = HMAC_SHA1_Text(Secret_Access_Key, StringToSign);

        List<FormItemModel> formDatas = new List<FormItemModel>();
        //添加文本
        formDatas.Add(new FormItemModel()
        {
            Key = "key",
            Value = file_name
        });
        //添加文本
        formDatas.Add(new FormItemModel()
        {
            Key = "AccessKeyId",
            Value = Access_Key_Id
        });
        //添加文本
        formDatas.Add(new FormItemModel()
        {
            Key = "signature",
            Value = Signature
        });
        //添加文本
        formDatas.Add(new FormItemModel()
        {
            Key = "policy",
            Value = StringToSign
        });
        //添加文件
        formDatas.Add(new FormItemModel()
        {
            Key = "file",
            Value = "",
            FileName = file_name,
            FileContent = File.OpenRead(file_url)
        });

        //提交表单
        string result= OBS_FileManage.PostForm(Host_Domain, formDatas);
        return result;

    }
    #region HMACSHA1加密  将二进制数据直接转为字符串返回
    /// <summary>
    /// HMACSHA1加密
    /// </summary>
    /// <param name="text">要加密的原串</param>
    ///<param name="key">私钥</param>
    /// <returns></returns>
    public static string HMAC_SHA1_Text(string key, string text)
    {
        //HMACSHA1加密
        HMACSHA1 hmacsha1 = new HMACSHA1();
        hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(key);

        byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(text);
        byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);

        return Convert.ToBase64String(hashBytes);
    }
    #endregion
    /// <summary>
    /// 使用Post方法获取字符串结果
    /// </summary>
    /// <param name="url"></param>
    /// <param name="formItems">Post表单内容</param>
    /// <param name="cookieContainer"></param>
    /// <param name="timeOut">默认20秒</param>
    /// <param name="encoding">响应内容的编码类型(默认utf-8)</param>
    /// <returns></returns>
    public static string PostForm(string url, List<FormItemModel> formItems, CookieContainer cookieContainer = null, string refererUrl = null, Encoding encoding = null, int timeOut = 20000)
    {
        //由于远程方已关闭传输流,身份验证失败 使用如下2条设置
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback((sender, certificate, chain, errors) => true);
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        #region 初始化请求对象
        request.Method = "POST";
        request.Timeout = timeOut;
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        request.KeepAlive = true;
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
        if (!string.IsNullOrEmpty(refererUrl))
            request.Referer = refererUrl;
        if (cookieContainer != null)
            request.CookieContainer = cookieContainer;
        #endregion

        string boundary = "----" + DateTime.Now.Ticks.ToString("x");//分隔符
        request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
        //请求流
        var postStream = new MemoryStream();
        #region 处理Form表单请求内容
        //是否用Form上传文件
        var formUploadFile = formItems != null && formItems.Count > 0;
        if (formUploadFile)
        {
            //文件数据模板
            string fileFormdataTemplate =
                "\r\n--" + boundary +
                "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" +
                "\r\nContent-Type: application/octet-stream" +
                "\r\n\r\n";
            //文本数据模板
            string dataFormdataTemplate =
                "\r\n--" + boundary +
                "\r\nContent-Disposition: form-data; name=\"{0}\"" +
                "\r\n\r\n{1}";
            foreach (var item in formItems)
            {
                string formdata = null;
                if (item.IsFile)
                {
                    //上传文件
                    formdata = string.Format(
                        fileFormdataTemplate,
                        item.Key, //表单键
                        item.FileName);
                }
                else
                {
                    //上传文本
                    formdata = string.Format(
                        dataFormdataTemplate,
                        item.Key,
                        item.Value);
                }

                //统一处理
                byte[] formdataBytes = null;
                //第一行不需要换行
                if (postStream.Length == 0)
                    formdataBytes = Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));
                else
                    formdataBytes = Encoding.UTF8.GetBytes(formdata);
                postStream.Write(formdataBytes, 0, formdataBytes.Length);

                //写入文件内容
                if (item.FileContent != null && item.FileContent.Length > 0)
                {
                    using (var stream = item.FileContent)
                    {
                        byte[] buffer = new byte[1024];
                        int bytesRead = 0;
                        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            postStream.Write(buffer, 0, bytesRead);
                        }
                    }
                }
            }
            //结尾
            var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
            postStream.Write(footer, 0, footer.Length);

        }
        else
        {
            request.ContentType = "application/x-www-form-urlencoded";
        }
        #endregion

        request.ContentLength = postStream.Length;

        #region 输入二进制流
        if (postStream != null)
        {
            postStream.Position = 0;
            //直接写入流
            Stream requestStream = request.GetRequestStream();

            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                requestStream.Write(buffer, 0, bytesRead);
            }

            //debug
            //postStream.Seek(0, SeekOrigin.Begin);
            //StreamReader sr = new StreamReader(postStream);
            //var postStr = sr.ReadToEnd();
            postStream.Close();//关闭文件访问
        }
        #endregion

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        if (cookieContainer != null)
        {
            response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
        }

        using (Stream responseStream = response.GetResponseStream())
        {
            using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.UTF8))
            {
                string retString = myStreamReader.ReadToEnd();
                return retString;
            }
        }
    }
}
public class FormItemModel
{
    /// <summary>
    /// 表单键,request["key"]
    /// </summary>
    public string Key { set; get; }
    /// <summary>
    /// 表单值,上传文件时忽略,request["key"].value
    /// </summary>
    public string Value { set; get; }
    /// <summary>
    /// 是否是文件
    /// </summary>
    public bool IsFile
    {
        get
        {
            if (FileContent == null || FileContent.Length == 0)
                return false;

            if (FileContent != null && FileContent.Length > 0 && string.IsNullOrWhiteSpace(FileName))
                throw new Exception("上传文件时 FileName 属性值不能为空");
            return true;
        }
    }
    /// <summary>
    /// 上传的文件名
    /// </summary>
    public string FileName { set; get; }
    /// <summary>
    /// 上传的文件内容
    /// </summary>
    public Stream FileContent { set; get; }
}


版权声明:本文为qiaowei361原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。