再来实现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成本。

有什么问题欢迎留言交流,谢谢。

以下是源码

#POSTsignTest.aspx.zip#

文章来源于腾讯云开发者社区,点击查看原文