Search code examples
iphoneobjective-ciostumblrnsmutableurlrequest

tumblr iphone integration


Hi i have done with status update in tumbler but i am facing problem when i am sending photo in the form of data, as shown below.

-(IBAction)sendPhoto
{
    NSString *email           = @"user_name@gmail.com";
    NSString *password        = @"password";
    NSString *sendType = @"photo";

    UIImage *imageMS = [UIImage imageNamed:@"Submit.png"];
    NSData *photoData = [[NSData alloc] initWithData:UIImagePNGRepresentation(imageMS)];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL URLWithString:@"http://www.tumblr.com/api/write"]];
    [request setHTTPMethod:@"POST"];
    NSString *request_body = [NSString 
            stringWithFormat:@"email=%@&password=%@&type=%@&data=%@",
            [email           stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            [password        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            [sendType        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
            photoData];
    [request setHTTPBody:[request_body dataUsingEncoding:NSUTF8StringEncoding]];
    [web loadRequest:request];
}

But it is not getting updated. Why?


Solution

  • My original answer proved to be incorrect, but the OP posted a link to code that he said fixed his problem. I have copied that code below so that future searchers can find it easily, since I know how frustrating it can be to see your problem described and find a link to the solution only to have that link be dead.

    Code based on http://forums.macrumors.com/showthread.php?t=427513:

    - (BOOL)sendPhotoToTumblr:(NSString *)photo usingEmail:(NSString *)tumblrEmail andPassword:(NSString *)tumblrPassword withCaption:(NSString *)caption;
    {
        //get image data from file
        NSData *imageData = [NSData dataWithContentsOfFile:photo];  
        //stop on error
        if (!imageData) return NO;
    
        //Create dictionary of post arguments
        NSArray *keys = [NSArray arrayWithObjects:@"email",@"password",@"type",@"caption",nil];
        NSArray *objects = [NSArray arrayWithObjects:
                tumblrEmail,
                tumblrPassword,
                @"photo", caption, nil];
        NSDictionary *keysDict = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
    
        //create tumblr photo post
        NSURLRequest *tumblrPost = [self createTumblrRequest:keysDict withData:imageData];
        [keysDict release];     
    
        //send request, return YES if successful
        tumblrConnection = [[NSURLConnection alloc] initWithRequest:tumblrPost delegate:self];
        if (!tumblrConnection) {
            NSLog(@"Failed to submit request");
            return NO;
        } else {
            NSLog(@"Request submitted");
            receivedData = [[NSMutableData data] retain];
                [tumblrConnection release];
            return YES;
        }
    }
    
    
    -(NSURLRequest *)createTumblrRequest:(NSDictionary *)postKeys withData:(NSData *)data
    {
        //create the URL POST Request to tumblr
        NSURL *tumblrURL = [NSURL URLWithString:@"http://www.tumblr.com/api/write"];
        NSMutableURLRequest *tumblrPost = [NSMutableURLRequest requestWithURL:tumblrURL];
        [tumblrPost setHTTPMethod:@"POST"];
    
        //Add the header info
        NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
        [tumblrPost addValue:contentType forHTTPHeaderField: @"Content-Type"];
    
        //create the body
        NSMutableData *postBody = [NSMutableData data];
        [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
        //add key values from the NSDictionary object
        NSEnumerator *keys = [postKeys keyEnumerator];
        int i;
        for (i = 0; i < [postKeys count]; i++) {
            NSString *tempKey = [keys nextObject];
            [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",tempKey] dataUsingEncoding:NSUTF8StringEncoding]];
            [postBody appendData:[[NSString stringWithFormat:@"%@",[postKeys objectForKey:tempKey]] dataUsingEncoding:NSUTF8StringEncoding]];
            [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
        }
    
        //add data field and file data
        [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"data\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[NSData dataWithData:data]];
        [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
        //add the body to the post
        [tumblrPost setHTTPBody:postBody];
    
        return tumblrPost;
    }
    

    I have modified the above code to eliminate some memory issues and to add some parameters to make this a more generic/flexible solution. However, if someone would like the original code as posted on that site, just look through this answer's edit revisions.