C# C:从Unity上传照片到Twitter
目前我与unity合作。在这个项目中,我需要发布一些状态和图片到twitter。然而,我在将图片上传到Twitter时遇到了一个问题 下面是我用来上传图片的代码:C# C:从Unity上传照片到Twitter,c#,twitter,unity3d,upload,media,C#,Twitter,Unity3d,Upload,Media,目前我与unity合作。在这个项目中,我需要发布一些状态和图片到twitter。然而,我在将图片上传到Twitter时遇到了一个问题 下面是我用来上传图片的代码: private const string UploadMediaURL = "https://upload.twitter.com/1.1/media/upload.json"; public static IEnumerator UploadMedia(string consumerKey, string consumerS
private const string UploadMediaURL = "https://upload.twitter.com/1.1/media/upload.json";
public static IEnumerator UploadMedia(string consumerKey, string consumerSecret, string filePath, AccessTokenResponse response){
Dictionary<string, string> mediaParameters = new Dictionary<string, string>();
mediaParameters.Add("media", System.Convert.ToBase64String(File.ReadAllBytes(filePath)));
// Add data to the form to post.
WWWForm mediaForm = new WWWForm();
mediaForm.AddField("media", System.Convert.ToBase64String(File.ReadAllBytes(filePath)));
print (System.Convert.ToBase64String (File.ReadAllBytes (filePath)));
// HTTP header
var mediaHeaders = new Hashtable();
mediaHeaders["Authorization"] = GetHeaderWithAccessToken("POST", UploadMediaURL, consumerKey, consumerSecret, response, mediaParameters);
WWW mw = new WWW(UploadMediaURL, mediaForm.data, mediaHeaders);
yield return mw;
if (!string.IsNullOrEmpty (mw.error)) {
Debug.Log(string.Format("PostTweet - failed. {0}"));
} else {
SetMediaWeb(mw);
}
}
当我调用上述方法时,我得到以下错误:
UriFormatException:Uri长于最大{0}个字符。
System.Uri.EscapeDataString System.String stringToEscape
仅供参考,图像大小不大,只有23KB,图像类型为png
我的代码有什么问题。谢谢您的帮助。您应该只在WWWForm对象中添加媒体参数。根据,上传媒体时: OAuth的处理方式有点不同。计算OAuth签名基串或签名时不使用POST或查询字符串参数。仅使用oauth_*参数
在参数字典中添加媒体在创建GetHeaderWithAccessToken签名期间产生错误。您应该只在WWWForm对象中添加媒体参数。根据,上传媒体时: OAuth的处理方式有点不同。计算OAuth签名基串或签名时不使用POST或查询字符串参数。仅使用oauth_*参数
在参数字典中添加媒体在创建GetHeaderWithAccessToken签名时产生错误。我也有同样的问题。我通过缩小我试图发布的图像的大小来解决这个问题。我不确定限制是多少,但我发现256*256 jpg工作正常 我还注意到你的代码和我的有点不同。这是我的密码
Dictionary<string, string> parameters = new Dictionary<string, string>();
string encoded64ImageData = ImageToBase64( imageData );
parameters.Add("media_data", encoded64ImageData );
// Add data to the form to post.
WWWForm form = new WWWForm();
form.AddField( "media_data", encoded64ImageData );
// HTTP header
Dictionary<string, string> headers = new Dictionary<string, string>();
string url = UploadMediaURL;
string auth = GetHeaderWithAccessToken("POST", url, consumerKey, consumerSecret, accessToken, parameters);
headers.Add( "Authorization", auth );
headers.Add( "Content-Transfer-Encoding", "base64" );
WWW web = new WWW(url, form.data, headers);
yield return web;
Twitter文档称,提交64位编码的媒体时,需要使用媒体数据
我还了解到,在提交64位数据表单时,需要定义contenttransferencoding=base64。。。这可能是必要的,也可能不是必要的,我没有试过。我也有同样的问题。我通过缩小我试图发布的图像的大小来解决这个问题。我不确定限制是多少,但我发现256*256 jpg工作正常 我还注意到你的代码和我的有点不同。这是我的密码
Dictionary<string, string> parameters = new Dictionary<string, string>();
string encoded64ImageData = ImageToBase64( imageData );
parameters.Add("media_data", encoded64ImageData );
// Add data to the form to post.
WWWForm form = new WWWForm();
form.AddField( "media_data", encoded64ImageData );
// HTTP header
Dictionary<string, string> headers = new Dictionary<string, string>();
string url = UploadMediaURL;
string auth = GetHeaderWithAccessToken("POST", url, consumerKey, consumerSecret, accessToken, parameters);
headers.Add( "Authorization", auth );
headers.Add( "Content-Transfer-Encoding", "base64" );
WWW web = new WWW(url, form.data, headers);
yield return web;
Twitter文档称,提交64位编码的媒体时,需要使用媒体数据
我还了解到,在提交64位数据表单时,需要定义contenttransferencoding=base64。。。这可能是必要的,也可能不是必要的,我没有试过。我没有足够的代表留下评论,但Antony的代码在推动事情进展方面很有用 问题是库使用的Uri.EscapeDataString方法有字符限制,因此如果文件大小较大,因此有一个长的base-64字符串,该方法将无法为Twitter添加正确的签名/时间戳内容,因此在尝试上载媒体时会导致401 因此,一个简单的解决方法是将base64字符串分割成更小的块,转义这些块,然后将它们全部拼凑在一起,以完成最后一篇文章。 下面的代码实际上取自另一个关于Uri.EscapeDataString的问题。 在构建表单对象时,只需调用此方法而不是Uri.EscapeDataString,就可以了
private static string EscapeString(string originalString)
{
int limit = 2000;
StringBuilder sb = new StringBuilder();
int loops = originalString.Length / limit;
for (int i = 0; i <= loops; i++)
{
if (i < loops)
{
sb.Append(Uri.EscapeDataString(originalString.Substring(limit * i, limit)));
}
else
{
sb.Append(Uri.EscapeDataString(originalString.Substring(limit * i)));
}
}
return sb.ToString();
}
我在我的最新游戏中使用了这个,它允许玩家轻松上传动画GIF,但还没有发现任何问题,我们的最大文件大小约为2mb,工作正常
祝你好运 我没有足够的代表留下评论,但安东尼的代码在推动事情进展方面很有用 问题是库使用的Uri.EscapeDataString方法有字符限制,因此如果文件大小较大,因此有一个长的base-64字符串,该方法将无法为Twitter添加正确的签名/时间戳内容,因此在尝试上载媒体时会导致401 因此,一个简单的解决方法是将base64字符串分割成更小的块,转义这些块,然后将它们全部拼凑在一起,以完成最后一篇文章。 下面的代码实际上取自另一个关于Uri.EscapeDataString的问题。 在构建表单对象时,只需调用此方法而不是Uri.EscapeDataString,就可以了
private static string EscapeString(string originalString)
{
int limit = 2000;
StringBuilder sb = new StringBuilder();
int loops = originalString.Length / limit;
for (int i = 0; i <= loops; i++)
{
if (i < loops)
{
sb.Append(Uri.EscapeDataString(originalString.Substring(limit * i, limit)));
}
else
{
sb.Append(Uri.EscapeDataString(originalString.Substring(limit * i)));
}
}
return sb.ToString();
}
我在我的最新游戏中使用了这个,它允许玩家轻松上传动画GIF,但还没有发现任何问题,我们的最大文件大小约为2mb,工作正常
祝你好运 这是我的代码,包括一篇带有状态的帖子。我使用的是Lets Tweet的代码: 感谢所有之前发布的帮助图片上传部分正常工作的人。通过Patrick的更改,您可以上传和发布任何高达5MB的图像或媒体文件
Dictionary<string, string> mediaParameters = new Dictionary<string, string> ();
string mediaString = System.Convert.ToBase64String (File.ReadAllBytes (filePath));
mediaParameters.Add ("media_data", mediaString);
mediaParameters.Add ("status", text);
// Add data to the form to post.
WWWForm mediaForm = new WWWForm ();
mediaForm.AddField ("media_data", mediaString);
mediaForm.AddField ("status", text);
// Debug.Log (System.Convert.ToBase64String (File.ReadAllBytes (filePath)));
// HTTP header
Dictionary<string, string> mediaHeaders = new Dictionary<string, string> ();
string url = UploadMediaURL;
string auth = GetHeaderWithAccessToken ("POST", UploadMediaURL, consumerKey, consumerSecret, response, mediaParameters);
mediaHeaders.Add ("Authorization", auth);
mediaHeaders.Add ("Content-Transfer-Encoding", "base64");
WWW mw = new WWW (UploadMediaURL, mediaForm.data, mediaHeaders);
yield return mw;
string mID = Regex.Match(mw.text, @"(\Dmedia_id\D\W)(\d*)").Groups[2].Value;
Debug.Log ("response from media request : " + mw.text);
Debug.Log ("mID = " + mID);
if (!string.IsNullOrEmpty (mw.error)) {
Debug.Log (string.Format ("PostTweet - failed. {0}\n{1}", mw.error, mw.text));
callback (false);
} else {
string error = Regex.Match (mw.text, @"<error>([^&]+)</error>").Groups [1].Value;
if (!string.IsNullOrEmpty (error)) {
Debug.Log (string.Format ("PostTweet - failed. {0}", error));
callback (false);
} else {
callback (true);
}
}
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("status", text);
parameters.Add ("media_ids", mID);
// Add data to the form to post.
WWWForm form = new WWWForm();
form.AddField("status", text);
form.AddField ("media_ids", mID);
// HTTP header
var headers = new Dictionary<string, string>();
headers["Authorization"] = GetHeaderWithAccessToken("POST", PostTweetURL, consumerKey, consumerSecret, response, parameters);
WWW web = new WWW(PostTweetURL, form.data, headers);
yield return web;
if (!string.IsNullOrEmpty(web.error))
{
Debug.Log(string.Format("PostTweet - failed. {0}\n{1}", web.error, web.text));
callback(false);
}
else
{
string error = Regex.Match(web.text, @"<error>([^&]+)</error>").Groups[1].Value;
if (!string.IsNullOrEmpty(error))
{
Debug.Log(string.Format("PostTweet - failed. {0}", error));
callback(false);
}
else
{
callback(true);
}
}
这是我的代码,包括一个状态为的帖子。我使用的是Lets Tweet的代码: 感谢所有之前发布的帮助图片上传部分正常工作的人。通过Patrick的更改,您可以上传和发布任何图像或 最高5MB的媒体文件
Dictionary<string, string> mediaParameters = new Dictionary<string, string> ();
string mediaString = System.Convert.ToBase64String (File.ReadAllBytes (filePath));
mediaParameters.Add ("media_data", mediaString);
mediaParameters.Add ("status", text);
// Add data to the form to post.
WWWForm mediaForm = new WWWForm ();
mediaForm.AddField ("media_data", mediaString);
mediaForm.AddField ("status", text);
// Debug.Log (System.Convert.ToBase64String (File.ReadAllBytes (filePath)));
// HTTP header
Dictionary<string, string> mediaHeaders = new Dictionary<string, string> ();
string url = UploadMediaURL;
string auth = GetHeaderWithAccessToken ("POST", UploadMediaURL, consumerKey, consumerSecret, response, mediaParameters);
mediaHeaders.Add ("Authorization", auth);
mediaHeaders.Add ("Content-Transfer-Encoding", "base64");
WWW mw = new WWW (UploadMediaURL, mediaForm.data, mediaHeaders);
yield return mw;
string mID = Regex.Match(mw.text, @"(\Dmedia_id\D\W)(\d*)").Groups[2].Value;
Debug.Log ("response from media request : " + mw.text);
Debug.Log ("mID = " + mID);
if (!string.IsNullOrEmpty (mw.error)) {
Debug.Log (string.Format ("PostTweet - failed. {0}\n{1}", mw.error, mw.text));
callback (false);
} else {
string error = Regex.Match (mw.text, @"<error>([^&]+)</error>").Groups [1].Value;
if (!string.IsNullOrEmpty (error)) {
Debug.Log (string.Format ("PostTweet - failed. {0}", error));
callback (false);
} else {
callback (true);
}
}
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("status", text);
parameters.Add ("media_ids", mID);
// Add data to the form to post.
WWWForm form = new WWWForm();
form.AddField("status", text);
form.AddField ("media_ids", mID);
// HTTP header
var headers = new Dictionary<string, string>();
headers["Authorization"] = GetHeaderWithAccessToken("POST", PostTweetURL, consumerKey, consumerSecret, response, parameters);
WWW web = new WWW(PostTweetURL, form.data, headers);
yield return web;
if (!string.IsNullOrEmpty(web.error))
{
Debug.Log(string.Format("PostTweet - failed. {0}\n{1}", web.error, web.text));
callback(false);
}
else
{
string error = Regex.Match(web.text, @"<error>([^&]+)</error>").Groups[1].Value;
if (!string.IsNullOrEmpty(error))
{
Debug.Log(string.Format("PostTweet - failed. {0}", error));
callback(false);
}
else
{
callback(true);
}
}
对新WWW.的呼叫是否有例外。。。?stacktrace是什么?调用new WWW时是否出现异常。。。?stacktrace是什么?对-这不再给出URI问题,但实际上它不会上传图像!除了Antony的建议之外,您是否做了任何更改?对-这不再会导致URI问题,但实际上不会上载图像!除了安东尼的建议之外,你还做了什么改变吗?嗨,克劳迪奥!你是如何上传图片的?提前谢谢你!嗨,克劳迪奥!你是如何上传图片的?提前谢谢你!