我在Titanium软件中使用Facebook上传图片时出错,每当我想从我的应用程序上传图像时我都会这样:
失败:对于v2.1及更高版本
,不推荐使用REST API
但是,如果我在KitchenSink示例应用程序中尝试相同的代码,它可以完美地运行:
var xhr = Titanium.Network.createHTTPClient({
onload: function() {
// first, grab a "handle" to the file where you'll store the downloaded data
var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
f.write(this.responseData); // write to the file
var blob = f.read();
var data = {
caption: 'behold, a flower',
picture: blob
};
facebook.request('photos.upload', data, showRequestResult);
},
timeout: 10000
});
xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
xhr.send();
在我的应用程序中:
function showRequestResult(e) {
var s = '';
if (e.success) {
s = "SUCCESS";
if (e.result) {
s += "; " + e.result;
}
} else {
s = "FAIL";
if (e.error) {
s += "; " + e.error;
}
}
alert(s);
}
Ti.App.hs_stats.addEventListener('touchend', function(e){
Ti.App.hs_stats.top = 255;
var xhr = Titanium.Network.createHTTPClient({
onload: function() {
// first, grab a "handle" to the file where you'll store the downloaded data
var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
f.write(this.responseData); // write to the file
var blob = f.read();
var data = {
caption: 'behold, a flower',
picture: blob
};
Ti.App.fb.request('photos.upload', data, showRequestResult);
},
timeout: 10000
});
xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
xhr.send();
});
答案 0 :(得分:2)
看起来你正在为Appcelerator使用'旧'Facebook模块?我有图片上传工作的个人资料和页面(虽然页面有点不同,我稍后会解释)。这是一些快速代码(我假设您已经通过Facebook验证):
var fb = require('facebook');
fb.appid = "xxxxxxxxxxxxxxxxx";
var acc = fb.getAccessToken();
fb.requestWithGraphPath('me/photos?access_token='+ acc, {picture:image, message: data}, "POST", showRequestResult);
图像变量只是一个blob - 它直接来自图库选择或相机意图的event.media。 data是状态更新的文本。
在你的tiapp.xml中添加以下行:
<property name="ti.facebook.appid">xxxxxxxxxxxxxxxxx</property>
和(如果你使用Android和iOS - 添加两者或只是你正在使用的平台)
<modules>
<module platform="android">facebook</module>
<module platform="iphone">facebook</module>
</modules>
现在页面有点奇怪:
var endPoint = 'https://graph.facebook.com/v2.1/' + pid + '/photos?access_token='+ acc;
xhr.open('POST',endPoint);
xhr.send({
message: data,
picture: image
});
你必须使用HTTP请求,因为无论我尝试什么,我都无法使用requestWithGraphPath()来处理页面。
pid是你的页面ID,你可以得到它,或者你是管理员的页面列表(再次,创建一个新的HTTP请求(xhr)并使用它):
xhr.open("GET","https://graph.facebook.com/v2.1/me?fields=accounts{access_token,global_brand_page_name,id,picture}&access_token=" +fb.getAccessToken());
这将返回每个页面的访问令牌,全局品牌名称(基本上是页面名称的干净版本),它的id和个人资料图片。此URL中的访问令牌是您的个人访问令牌(&amp; access_token = part)。
据我所知,这些访问令牌不会因页面而过期,因此您可以将其保存在应用程序的某个地方,或者如果您真的想要安全,可以在每个帖子之前获取一个令牌,但这是一个有点多。
奖金:
如果您想对网页发布视频帖子:
var xhr = Titanium.Network.createHTTPClient();
var endPoint = 'https://graph-video.facebook.com/'+ pid +'/videos?access_token='+ acc;
xhr.open('POST',endPoint);
xhr.setRequestHeader("enctype", "multipart/form-data");
xhr.send({source:video, description:data});
和个人资料:
var acc = fb.getAccessToken();
var xhr = Titanium.Network.createHTTPClient();
var endPoint = 'https://graph-video.facebook.com/me/videos?access_token='+ acc;
xhr.open('POST',endPoint);
xhr.setRequestHeader("enctype", "multipart/form-data");
xhr.send({source:video, description:data});
视频是来自相机或图库事件的另一个blob。媒体意图和数据是您要用于状态更新的文本。