2011-11-30 79 views
0

我试图从本地应用程序上传本地用户创建的照片到用户的Facebook Wall。我正在Objective-C开发一个应用程序,并使用PhFacebook库与社交网络进行交互,但我认为我的问题更可能来自我与Facebook实际交互的缺陷。Facebook图形API将本地图像上传到墙上(Objective-C)

事实上,上传状态,用户的个人资料,在已经得到了一个访问令牌,该代码工作得很好:

NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:1]; 

[variables setObject:@"This is a test." forKey:@"message"]; 

[fb sendRequest:@"me/feed" params:variables usePostRequest:YES]; 

但是,如果我尝试直接将照片上传到了me/feed,使用下面的代码,它有系统故障时,作为未示出的图像和周围的文本是:

NSString *path = @"some/path/to/some/image/on/my/computer"; 

NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:2]; 

[variables setObject:@"This is a test." forKey:@"message"]; 

[variables setObject:path forKey:@"source"]; 

[fb sendRequest:@"me/feed" params:variables usePostRequest:YES]; 

我试图修改sourceimagephotopicture,filedata,但没有看到变化,并且source似乎是最正确的。

在阅读了关于上传照片的文档:http://developers.facebook.com/docs/reference/api/photo/后,我了解到source参数对应于一个URL。我试图直接在用户的计算机上上传图片的数据或图片的本地路径,但我仍然没有找到上传尚未上网的图片的方法。我确信有一种方法可以做到这一点,即使上传一词也意味着图像应该是本地的!

基本上,它似乎我有这个问题的相反:Upload a hosted image with Facebook's Graph API by url?

在此先感谢任何人谁可以帮助,我的Facebook好友也开始在所有这些测试消息是不解:)

回答

2

原来,您只能使用PhFacebook进行更简单的请求。下面是我不得不将Facebook上的本地图像上传到Facebook Wall,而不使用PhFacebook以及在Mac上:

- 使用WebView和ASIHTTPRequest获取带有publish_stream权限的Facebook访问令牌(http:// www.capturetheconversation.com/technology/iphone-facebook-oauth2-graph-api)。

- 制作一个简单的ASIHTTPRequest实际上传的图片:

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/me/photos?access_token=%@", access_token]]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 

    [request addFile:@"/path/tolocalimage/" forKey:@"file"]; 

    [request setPostValue:[NSString stringWithFormat:@"This is a test."] forKey:@"message"]; 

    [request startAsynchronous]; 

而且你去那里!这个解决方案似乎比使用现有的框架更简单!唯一耗费时间的部分是构建WebView界面,但您可以从我发布的链接和PhFacebook中简单地启发自己。h,它使用了类似的(但略有不同)技术。

+0

这个答案是如何工作的,但仍然没有投票? – chunkyguy

+0

+ 1,它运行的很酷,但我想将图像张贴到用户的墙上? – Dinesh

2

我只是想方法上张贴在这里:Facebook connect on iOS picture doesn't display with wall post,它可能会帮助你的事业。 但是,由于图片上传到您的应用程序相册而不是“壁纸专辑”,因此它的行为似乎与真实的“墙壁图片文章”略有不同。 Facebook提到“[YourFBName]已经添加了几张图片到[ApplicationName]相册”(一个“分组”的墙上张贴了不同的事件)。

尽管直接使用FB界面在墙上张贴了多张图片,即使它们全部添加到“墙相册”中,它们也始终显示为单独的帖子(墙贴在此未分组)。

+0

感谢您的帮助。这段代码很有趣,但我已经将我的问题缩小到了我用来与Facebook进行交互的库。事实上,PhFacebook只允许您将图片作为网址上传,而不是作为NSData上传......我必须使用这个库,因为它是Facebook唯一能够很好地处理登录过程的Mac API,并且我不知道如何端口Facebook iOS的登录对话框。你有好主意吗? – elliottbolzan

3

您也可以直接上传照片,无需制作网址。 这里是代码 -

NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%@", @"facebook id"]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSString *boundary = @"----1010101010"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] 
     dataUsingEncoding:NSUTF8StringEncoding]]; 
NSEnumerator *enumerator = [post_vars keyEnumerator]; 
NSString *key; 
NSString *value; 
NSString *content_disposition; 
while ((key = (NSString *)[enumerator nextObject])) { 

    //if it's a picture (file)...we have to append the binary data 
    if ([key isEqualToString:@"file"]) { 
     NSData *picture_data = UIImagePNGRepresentation([post_vars objectForKey:key]); 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"media\";\r\nfilename=\"media.png\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:picture_data]; 
    } else { 
     value = (NSString *)[post_vars objectForKey:key]; 

     content_disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]; 
     [body appendData:[content_disposition dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[value dataUsingEncoding:NSUTF8StringEncoding]]; 

    } 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 
[body appendData:[@"Content-Disposition: form-data; name=\"access_token\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:access_token] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body]; 
[request addValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField: @"Content-Length"];  
NSData *data_reply; 
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:delegate startImmediately:YES]; 
[conn start]; 
BOOL flag = YES; 
NSString *stringResponse = [[NSString alloc] initWithData:data_reply encoding:NSUTF8StringEncoding]; 
NSError *err = [[NSError alloc] init]; 
if (err != nil) { 
    NSData *dataStr = [stringResponse dataUsingEncoding:NSUTF8StringEncoding]; 
    NSMutableDictionary *data = [NSJSONSerialization JSONObjectWithData:dataStr options:kNilOptions error:&err]; 
    if([data objectForKey:@"Error"]!=nil){ 
    } 
}iscr 
stringResponse = nil; 
data_reply = nil; 

样品}

在此所述POST_VARS是字典其是如下文描述 -

的NSMutableDictionary * POST_VARS = [的NSMutableDictionary dictionaryWithCapacity:4];

[post_vars setObject:@"this is a message" forKey:@"message"]; 
[post_vars setObject:@"name" forKey:@"name"]; 
[post_vars setObject:@"description" forKey:@"description"]; 
[post_vars setObject:imagename forKey:@"file"]; 
相关问题