twitpic API help (multipart/form-data upload)

Discussion in 'iPhone/iPad Programming' started by begdev, Nov 21, 2009.

  1. macrumors newbie

    Joined:
    Mar 14, 2009
    #1
    I've put together this code from lots of research.
    Information on the twitpic API is here: Twitpic - Share photos on Twitter

    Through debugging i can tell that the dictionary is good, and that it gets through all the methods, the request gets submitted, but then the NSLog method returns <>.

    I'm not sure where I could be going wrong, i don't know much about the multipart/form-data structure. Maybe I'm doing something wrong with my connection?

    Code below.

    Code:
    -(void)uploadBoth {		
    		//Create dictionary of post arguments
    		NSArray *keys = [[NSArray alloc] initWithObjects:@"media",@"username",@"password",@"message",nil];
    		NSArray *objects = [[NSArray alloc] initWithObjects:
    							imageData, twitterUserSave, twitterPassSave, [NSString stringWithFormat:@"%@",messageView.text], nil];
    	
    		NSDictionary *keysDict = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
    	NSLog(@"%@", keysDict);
    		
    		//create twitpic photo post
    		NSURLRequest *twitpicPost = [self twitpicRequest:keysDict withData:imageData];
    		
    		//send request, return YES if successful
    		NSURLConnection *twitpicConnection = [[NSURLConnection alloc] initWithRequest: twitpicPost delegate:self];
    	
    		if (!twitpicConnection) {
    			NSLog(@"Failed to submit request");
    		} else {
    			NSLog(@"Request submitted");
    			NSData *receivedData = [[NSMutableData data] retain];
    			NSLog(@"%@", receivedData); // THIS PART RETURNS <>
    		}
    }
    
    
    The NSURLRequest part
    Code:
    	
    -(NSURLRequest *)twitpicRequest:(NSDictionary *)postKeys withData:(NSData *)data {
    		
    	NSLog(@"got this far");
    	
    		//create the URL POST Request to twitpic
    		NSURL *twitpicURL = [NSURL URLWithString:@"http://twitpic.com/api/uploadAndPost"];
    		NSMutableURLRequest *twitpicPost = [NSMutableURLRequest requestWithURL:twitpicURL];
    		[twitpicPost setHTTPMethod:@"POST"];
    		
    		//Add the header info
    		NSString *stringBoundary = [NSString stringWithString:@"0xAbCdEfGbOuNdArY"];
    		NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
    		[twitpicPost 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
    		[twitpicPost setHTTPBody:postBody];
    	
    	return twitpicPost;
    }
     

Share This Page