Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

objective c - Upload Multiple Images to Server IOS

I want to know how to upload multiple images to a server using objective C. Here is the code snippet that I am trying to use.

-(void)uploadImage:(NSMutableArray *)image andMessageBO:(MessageBO *)message
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@PostImageServlet?",kPostImageUploadWebServiceURL]];
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:url];

    [postRequest setHTTPMethod:@"POST"];
    [postRequest setTimeoutInterval:60.0];
    NSString *stringBoundary = @"0xKhTmLbOuNdArY";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
    [postRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSData *imageData =UIImagePNGRepresentation(image);


    NSMutableData *postBody = [[NSMutableData alloc] init];
    [postBody appendData:[[NSString stringWithFormat:@"isFormField=true"]dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"--%@
",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%@",@"Content-Disposition: form-data; name="userid"

"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%d",messageBO.messageId] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"
--%@
",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="profilepic"; filename="%d_postImage.png"
",messageBO.messageId] dataUsingEncoding:NSUTF8StringEncoding]];
       for (int i = 0; i < [image count]; i++)
    {
        [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="profilepic"; filename="%d_postImage%d.png"
",messageBO.messageId,i] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[image objectAtIndex:i]];
    }
    [postBody appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream

"] dataUsingEncoding:NSUTF8StringEncoding]];

    [postBody appendData:[NSData dataWithData:imageData]];
    [postBody appendData:[[NSString stringWithFormat:@"
--%@--
",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postRequest setHTTPBody:postBody];

    NSData *returnData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    DebugLog(@"IMge:%@",returnString);

    //  [self removeOfflineImage:expenseBO];

}

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I personally using this method to communicate and upload staff to server this is a json type of approach:

- (NSURLRequest *)convertToRequest:(NSString *)stringURL withDictionary:(NSDictionary *)dictionary
{

    NSError *error = nil;

    NSData *JSONData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];

    NSURL *url = [NSURL URLWithString:stringURL];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody: JSONData];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept-Encoding"];

    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[JSONData length]] forHTTPHeaderField:@"Content-Length"];


    return request;
}

The dictionary parameter is filled with something like:

first convert the data to base64String something like:

NSData *data = UIImageJPEGRepresentation(self.userImageView.image, 1.0);

NSData *imageBase64Data = [data base64EncodedDataWithOptions:0];

NSString *imageBase64String = [[NSString alloc] initWithData:imageBase64Data encoding: NSUTF8StringEncoding];

add this to dictionary...

NSDictionary *jsonDictionary = @{
                                   @0 : @{
                                     "name": "file1",
                                     "image" : imageBase64String1
                                   },
                                   @1 : @{
                                     "name": "file2",
                                     "image" : imageBase64String2
                                   } //and so on.. 
                                }; 
//you may want to put that in a loop

[ImplementationClass convertToRequest:YourServerURL withDictionary: jsonDictionary];

and at the server side something like:

decodes the data sent to server (PHP):

// Retrieves data

$handle = fopen('php://input','r');
$jsonInput = fgets($handle);
$json_decoded = json_decode($jsonInput,true);

/* 
* I commented this because i'm not sure if this suits my `NSDictionary` above
* but you can always check by logging `$json_decoded` or probably `var_dump()` function of php
*
* $json_decoded[0]['name'];
* $json_decoded[0]['image'];
* $json_decoded[1]['name'];
* $json_decoded[1]['image'];
*/

function upload_image($filename, $uploadedfile) {

    $save_file_path = getcwd()."/uploads/";

    $save_file_path     .= $filename;

    $image_file         = base64_decode($uploadedfile);

    //DELETES EXISTING
    if (file_exists($save_file_path)) {  unlink($save_file_path);  } 

    //CREATE NEW FILE
    file_put_contents($save_file_path, $image_file); 

    //CHECK FILE IF EXIST 
    return ((file_exists($save_file_path)) ? true : false );

}

hope this is helpful for you.. cheers..


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...