Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload multiple images without using ASIHTTPRequest

I want to upload two images to the server with following code can any one please help me, here is my code for post data

- (void)uploadPath:(NSString*)path withOptions:(NSDictionary*)options withImageData1:(NSData*)data1 ofImageName1:(NSString *)imageName1 andImageData2:(NSData*)data2 ofImageName2:(NSString *)imageName2 {  
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSURL *url = [NSURL URLWithString:path relativeToURL:[NSURL URLWithString:baseURLString]];
    NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:90.0];

    NSString *boundary = @"-------1234567";

    [mutableRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
    [mutableRequest setHTTPMethod:@"POST"];
    NSMutableData *postbody = [NSMutableData data];

    for(NSString *key in options)
    {
        NSString *value = [options objectForKey:key];
        [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
        [postbody appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
    }   
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //*******************   Append 1st Image    ************************/

    if ([imageName1 isEqualToString:@"picture1.jpg"]) {
        [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"picture1\"; filename=\"%@\"\r\n",imageName1] dataUsingEncoding:NSUTF8StringEncoding]];
    }
    [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[NSData dataWithData:data1]];
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    //*******************   Append 1st Image    ************************/

    //*******************   Append 2nd Image    ************************/   

    if ([imageName2 isEqualToString:@"picture2.jpg"]) {
        [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"picture2\"; filename=\"%@\"\r\n",imageName2] dataUsingEncoding:NSUTF8StringEncoding]];
    }
    [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[NSData dataWithData:data2]];

    //*******************   Append 2nd Image    ************************/

        [mutableRequest setHTTPBody:postbody];
    urlConnection = [[NSURLConnection alloc] initWithRequest:mutableRequest delegate:self];
    if (self.urlConnection) {
        self.dataXml = [NSMutableData data];
    }
    self.urlConnection = nil;
    [mutableRequest release];
    [pool release];
}
like image 595
iOS Monster Avatar asked Mar 25 '26 10:03

iOS Monster


2 Answers

One solution to see what is wrong:

  1. make a new project, using ASIHttpRequest
  2. Get a web debugging proxy like Charles
  3. Turn on Charles (or whatever), do a multi-file upload that succeeds. Record data from HTTP traffic to server.
  4. Now run your own code. Record that traffic. What is different from your traffic to the working traffic? Makes yours IDENTICAL in all respects, and how can it not work?

You can also replace step (1) with a curl command line that uploads multiple files to a server and record that traffic, but I'm not versed enough in curl to say off the top of my head what that command would look like.

like image 50
Kendall Helmstetter Gelner Avatar answered Mar 28 '26 00:03

Kendall Helmstetter Gelner


- (NSString*) nameValString: (NSDictionary*) dict {//example CHLOVA_FORM_BOUNDARY is @"aaa"
NSArray* keys = [dict allKeys];
NSString* result = [NSString string];
int i;
for (i = 0; i < [keys count]; i++) {
    result = [result stringByAppendingString:
              [@"--" stringByAppendingString:
               [CHLOVA_FORM_BOUNDARY stringByAppendingString:
                [@"\r\nContent-Disposition: form-data; name=\"" stringByAppendingString:
                 [[keys objectAtIndex: i] stringByAppendingString:
                  [@"\"\r\n\r\n" stringByAppendingString:
                   [[dict valueForKey: [keys objectAtIndex: i]] stringByAppendingString: @"\r\n"]]]]]]];
}

return result;
}

- (void)sendPhoto{
NSString *param = [self nameValString:dic];//dic is post info like {lat=36;lng=120;}
NSString *footer = [NSString stringWithFormat:@"\r\n--%@--\r\n", CHLOVA_FORM_BOUNDARY];

param = [param stringByAppendingString:[NSString stringWithFormat:@"--%@\r\n", CHLOVA_FORM_BOUNDARY]];
param = [param stringByAppendingString:@"Content-Disposition: form-data; name=\"pic\";filename=\"image.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"];

NSData *jpeg = UIImageJPEGRepresentation([UIImage imageWithContentsOfFile:_path], 0.55);
//NSLog(@"jpeg size: %d", [jpeg length]);

NSMutableData *data = [NSMutableData data];
//img one
[data appendData:[param dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:jpeg];
[data appendData:[footer dataUsingEncoding:NSUTF8StringEncoding]];
//img two
[data appendData:[param2 dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:jpeg2];
[data appendData:[footer2 dataUsingEncoding:NSUTF8StringEncoding]];

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", CHLOVA_FORM_BOUNDARY];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPShouldHandleCookies:NO];
[request setHTTPMethod:@"POST"];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [data length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:data];
//then do sending
}
like image 34
Seamus Avatar answered Mar 27 '26 22:03

Seamus



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!