再来实现post方法
//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 = "post.txt";//上传的object名称为post.txt
string uri = "/" +key;
string method = "post";
//2.签名计算
string SignKey = ComputeHash(Encoding.ASCII.GetBytes(SecretKey), q_key_time);//对签名的有效起止时间加密计算值SignKey
string HttpString = method + "\n" + uri + "\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 strsign= "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; //用于post的签名串
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} 都替换成自己的
//3.定义消息体
string data = "12345678";
string boundary = RandCode(33);
string br = "\r\n";
try
{
string header = "--" + boundary + br +
"Content-Disposition: form-data; name=\"key\"" +
br + br +
"${filename}" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"success_action_status\"" +
br + br +
"201" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"Acl\"" +
br + br +
"public-read" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"x - cos - storage -class\"" +
br + br +
"STANDARD" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"Signature\"" +
br + br +
strsign +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"x - Cos - meta - bb\"" +
br + br +
"124" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"key1\"" +
br + br +
"1" +
br +
"--" + boundary + br +
"Content-Disposition: form-data; name=\"file\"; filename=\""+key+"\"" +
br + br +
data +
br +
"--" + boundary + br;
//4.上传对象
PostWebRequest("http://{bucket}-{appid}.cos.ap-beijing.myqcloud.com" + uri, header, Encoding.UTF8, boundary);//把{bucket} {appid} 都替换成自己的
Response.Write("post上传完成");
}
catch (Exception ex)
{
Response.Write("post上传失败:" + ex.Message);
}
//5.工具方法
/// <summary>
/// 获取时间戳
/// </summary>
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>
/// Encode方法
/// </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>
/// SHA加密方法
/// </summary>
/// <param name="code"></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 数字和字母随机数
/// <summary>
/// 数字和字母随机数
/// </summary>
/// <param name="n">生成长度</param>
/// <returns></returns>
public static string RandCode(int n)
{
char[] arrChar = new char[]{
'a','b','d','c','e','f','g','h','i','j','k','l','m','n','p','r','q','s','t','u','v','w','z','y','x',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Q','P','R','T','S','V','U','W','X','Y','Z'
};
StringBuilder num = new StringBuilder();
Random rnd = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < n; i++)
{
num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
}
return num.ToString();
}
#endregion
/// <summary>
/// 发起httpPost 请求,可以上传文件
/// </summary>
/// <param name="url">请求的地址</param>
/// <param name="files">文件</param>
/// <param name="input">表单数据</param>
/// <param name="endoding">编码</param>
/// <returns></returns>
public static string PostResponse(string url, Dictionary<string, string> input, Encoding endoding,string boundary)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
request.KeepAlive = true;
request.Expect = "";
MemoryStream stream = new MemoryStream();
byte[] line = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
byte[] enterER = Encoding.ASCII.GetBytes("\r\n");
//提交文本字段
if (input != null)
{
string format = "--" + boundary; //自带项目分隔符
foreach (string key in input.Keys)
{
string s = string.Format(format, key, input[key]);
byte[] data = Encoding.UTF8.GetBytes(s);
stream.Write(data, 0, data.Length);
}
}
byte[] foot_data = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n"); //项目最后的分隔符字符串需要带上--
stream.Write(foot_data, 0, foot_data.Length);
request.ContentLength = stream.Length;
Stream requestStream = request.GetRequestStream(); //写入请求数据
stream.Position = 0L;
stream.CopyTo(requestStream); //
stream.Close();
requestStream.Close();
try
{
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
try
{
using (var responseStream = response.GetResponseStream())
using (var mstream = new MemoryStream())
{
responseStream.CopyTo(mstream);
string message = endoding.GetString(mstream.ToArray());
return message;
}
}
catch (Exception ex)
{
throw ex;
}
}
catch (WebException ex)
{
throw ex;
}
}
catch (Exception ex)
{
throw ex;
}
}
private string PostWebRequest(string postUrl, string paramData, Encoding dataEncode, string boundary)
{
string ret = string.Empty;
try
{
byte[] byteArray = dataEncode.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.ContentType = "multipart/form-data; boundary="+ boundary;
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
return ret;
}
抓包看,上传成功。
感兴趣的小伙伴们可以下载直接使用,基于C#改成java也很方便,希望可以降低大家调试API成本。
有什么问题欢迎留言交流,谢谢。
以下是源码