| NSData *theImage; |
| } |
| @property (retain) NSData *theImage; |
| - (void) syncUpload:(NSData *) uploadImage; |
| @end |
| |
| |
| #import "ImageUploader.h" |
| |
| #define NOTIFY_AND_LEAVE(X) {[self cleanup:X]; return;} |
| #define DATA(X) [X dataUsingEncoding:NSUTF8StringEncoding] |
| |
| // Posting constants |
| #define IMAGE_CONTENT @"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n" |
| #define BOUNDARY @"------------0x0x0x0x0x0x0x0x" |
| |
| @implementation ImageUploader |
| @synthesize theImage; |
| |
| |
| - (void) syncUpload:(NSData *) uploadImage |
| { |
| self.theImage = uploadImage; |
| [self main]; |
| } |
| |
| - (void) cleanup: (NSString *) output |
| { |
| self.theImage = nil; |
| // NSLog(@"******** %@", output); |
| } |
| |
| - (NSData*)generateFormDataFromPostDictionary:(NSDictionary*)dict |
| { |
| id boundary = BOUNDARY; |
| NSArray* keys = [dict allKeys]; |
| NSMutableData* result = [NSMutableData data]; |
| |
| for (int i = 0; i < [keys count]; i++) |
| { |
| id value = [dict valueForKey: [keys objectAtIndex:i]]; |
| [result appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; |
| |
| if ([value isKindOfClass:[NSData class]]) |
| { |
| // handle image data |
| NSString *formstring = [NSString stringWithFormat:IMAGE_CONTENT, [keys objectAtIndex:i]]; |
| [result appendData: DATA(formstring)]; |
| [result appendData:value]; |
| } |
| |
| NSString *formstring = @"\r\n"; |
| [result appendData:DATA(formstring)]; |
| } |
| |
| NSString *formstring =[NSString stringWithFormat:@"--%@--\r\n", boundary]; |
| [result appendData:DATA(formstring)]; |
| return result; |
| } |
| |
| |
| // NSOperationQueueによる非同期化を見据えてmainにしています。 |
| - (void) main |
| { |
| if (!self.theImage) { |
| NOTIFY_AND_LEAVE(@"Please set image before uploading."); |
| } |
| NSString* MultiPartContentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BOUNDARY]; |
| |
| NSMutableDictionary* post_dict = [[NSMutableDictionary alloc] init]; |
| [post_dict setObject:@"testimage" forKey:@"filename"]; |
| [post_dict setObject:self.theImage forKey:@"data[User][image]"]; |
| |
| NSData *postData = [self generateFormDataFromPostDictionary:post_dict]; |
| [post_dict release]; |
| |
| NSString *baseurl = @"https://example.com/api/upload_image"; |
| NSURL *url = [NSURL URLWithString:baseurl]; |
| NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; |
| if (!urlRequest) NOTIFY_AND_LEAVE(@"Error creating the URL Request"); |
| |
| [urlRequest setHTTPMethod: @"POST"]; |
| [urlRequest setValue:MultiPartContentType forHTTPHeaderField: @"Content-Type"]; |
| [urlRequest setHTTPBody:postData]; |
| |
| NSError *error; |
| NSURLResponse *response; |
| NSData* result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; |
| //NSLog(@"***** result =%@", result); |
| |
| if (!result) |
| { |
| [self cleanup:[NSString stringWithFormat:@"upload error: %@", [error localizedDescription]]]; |
| return; |
| } |
| |
| // Return results |
| NSString *outstring = [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]; |
| NSLog(@"***** outstring =%@", outstring); |
| [self cleanup: outstring]; |
| } |
| |