移动云卖的多数产品都是来至于华为云的,导致移动云上的文档都要到华为云上查阅,华为云上的帮助文档写的很粗糙,这点应该像微信开发文档学习,经过多天的反复查阅资料写了个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版权协议,转载请附上原文出处链接和本声明。