繁体   English   中英

C#Twitter-上传图像-没有第三方库

[英]C# Twitter - Upload Image - No 3rd party Libraries

我有一个图书馆,我之前写过,可以将新状态发布到Twitter。 因此,OAuth标头等的处理全部正常。

但是,我现在需要使用Twitter REST API上传图像:

https://upload.twitter.com/1.1/media/upload.json

发布状态时,我通常将以下内容放入请求流'status=<my tweet here>'

理想情况下,我想发布原始图像数据,而不是Base64字符串,但是,它们每个都工作时遇到问题。

根据Twitter的说法,OAuth仅应从以'oauth_'开头的键构建-我仅将以下内容放入:

parameters.Add("oauth_consumer_key", consumerKey);
parameters.Add("oauth_signature_method", "HMAC-SHA1");
parameters.Add("oauth_timestamp", Base.Methods.UNIXTimestamp);
parameters.Add("oauth_nonce", Guid.NewGuid().ToString().Replace("-", ""));
parameters.Add("oauth_version", "1.0");
parameters.Add("oauth_token", token);

Twitter表示,如果不确定要使用application/octet-stream的内容类型,那么在执行此操作时,我会收到以下答复:

Code: 38
Message: Missing Parameter Media

实际上,当将内容类型设置为multipart/form-data时,我也会得到相同的响应,如Twitter其他页面中所建议的那样

我尝试了将图像数据添加到webrequest的各种组合,但似乎都失败了。

media=<my image byte data here>
Add header of 'media' with image data in the request

以及其他我能想到的组合。 尝试发送Base64版本时,我什至遇到相同的问题(我宁愿不这样做)。

读完许多其他问题后,我似乎看不到我在做什么错。

有人可以帮忙吗?

我发现了问题,所有问题都归结为请求流中发送的内容。

如twitter所说,仅发送oauth_xxxx参数,此请求不需要基于内容的参数。

诀窍是建立多部分表单,我做了以下工作:

  1. 我正在使用HttpWebrequest,因此将其设置为发送多部分表单标题:

     string boundary = "----" + DateTime.UtcNow.Ticks.ToString("x"); webRequest.ContentType = "multipart/form-data; boundary=" + boundary; 
  2. 构建要发送的内容,该内容同时具有实际图像数据的前缀和后缀

     StringBuilder prefixData = new StringBuilder(); prefixData.Append("--"); prefixData.Append(boundary); prefixData.Append(Environment.NewLine); prefixData.Append("Content-Disposition: form-data; name=\\"media\\""); prefixData.Append(Environment.NewLine); prefixData.Append(Environment.NewLine); byte[] prefix = Encoding.UTF8.GetBytes(prefixData.ToString()); StringBuilder suffixData = new StringBuilder(); suffixData.Append(Environment.NewLine); suffixData.Append("--"); suffixData.Append(boundary); suffixData.Append("--"); byte[] suffix = Encoding.UTF8.GetBytes(suffixData.ToString()); 
  3. 将每个数据节连接在一起以发布到流中:

     byte[] data = new byte[prefix.Length + imageData.LongLength + suffix.Length]; Buffer.BlockCopy(prefix, 0, data, 0, prefix.Length); Buffer.BlockCopy(imageData, 0, data, prefix.Length, imageData.Length); Buffer.BlockCopy(suffix, 0, data, prefix.Length + imageData.Length, suffix.Length); 
  4. 正常将数据写入请求流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM