我有一个我刚才写的图书馆,允许我向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版本时,我甚至会遇到同样的问题(我宁愿不这样做)。
在阅读了很多其他问题后,我似乎无法看到我做错了什么。
有人可以帮忙吗?
答案 0 :(得分:0)
我发现了问题,这一切都归结为请求流中发送的内容。
正如Twitter所说,只发送oauth_xxxx
参数,此请求不需要基于内容的参数。
诀窍是构建多部分表单,我已经完成了以下操作:
我正在使用HttpWebrequest,因此请将其设置为发送多部分表单标题:
string boundary = "----" + DateTime.UtcNow.Ticks.ToString("x");
webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
构建要发送的内容,该内容具有实际图像数据的前缀和后缀
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());
将每个数据部分连接在一起以发布到流:
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);
正常将数据写入请求流。