user3518618
user3518618

Reputation: 31

How to send image attachment to server in post data iOS objective c

Send data to server works in postman but getting error in Objective-C.

image1

I tried to achieve this one failed from server. I referred below links does not work. Getting error upload failed. What am I doing wrong?

Upload image to server ios

how to POST value while uploading image in iOS objective c

My Code:

NSData *dataImage = UIImageJPEGRepresentation(myImage, 1.0f);

// set your URL Where to Upload Image
NSString *urlString = @"http://xxxxxxxxxxxxxxxx/index.php/API/uploadClaim";

NSDictionary *user = [[NSUserDefaults standardUserDefaults] objectForKey:@"userDetails"];

// Create 'POST' MutableRequest with Data and Other Image Attachment.

NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
[_params setObject:@"filename"  forKey:@"file_name"];
[_params setObject:@"photo"  forKey:@"file_type"];
[_params setObject:[[user objectForKey:@"user_data"] objectForKey:@"id"]  forKey:@"user_id"];

NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
NSString* FileParamConstant = @"image";

NSURL* requestURL = [NSURL URLWithString:urlString];

// create request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:120];
[request setHTTPMethod:@"POST"];

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];

// post body
NSMutableData *body = [NSMutableData data];

// add params (all params are strings)
for (NSString *param in _params)
{
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

// add image data
if (dataImage) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:dataImage];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
// set URL
[request setURL:requestURL];

NSURLResponse *response = nil;
NSError *requestError = nil;

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:&requestError];

Upvotes: 2

Views: 1437

Answers (3)

Mohit Bhakre
Mohit Bhakre

Reputation: 11

you can use much simpler approach for data as well as for image:

NSDictionary *headers = @{ @"content-type": @"multipart/form-data; boundary=---------------------------14737809831466499882746641449",
                           @"cache-control": @"no-cache" };
NSMutableArray *parameters = [[NSMutableArray alloc]initWithObjects:@"param1",@"param2", nil];
NSMutableArray *values = [[NSMutableArray alloc]initWithObjects:@"value1",@"value2", nil];
NSString *boundary = @"---------------------------14737809831466499882746641449";
//NSData *dataImage = UIImageJPEGRepresentation(imageView.image, 1.0f); uncomment for image

NSMutableData *body = [NSMutableData data];

for (int i=0;i<parameters.count;i++) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",[parameters objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@",[values objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
}
NSLog(@"Parameters : %@",parameters);
NSLog(@"Values : %@",values);

//image 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"file.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
//[body appendData:[NSData dataWithData:dataImage]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://your API URL here"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:body];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                 if (error) {
                     NSLog(@"%@", error);
                 } else {
                     NSMutableArray *array=[[NSMutableArray alloc]init];
                     rowBtnTableLast2=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
                     NSLog(@"PostMethod Result : %@, PostMethod Error : %@",array,error);
                 }}];
[dataTask resume];

Upvotes: 1

M Zubair Shamshad
M Zubair Shamshad

Reputation: 2741

Here is my working code to upload one or multiple image files:

Please note: you should pass images/files data in an NSDictionary with proper key values & You should set key name as your server expecting in upload call.
For example in your case it is file

parameters dictionary will be your other parameters to send with file

- (void) performNetworkEventRequestCallWithFileUpload :(NSMutableDictionary*) imagesData : (NSMutableDictionary*)parameters completionBlock:(void (^)(BOOL succeeded, NSDictionary *dict))completionBlock {


NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
[urlRequest setURL:[NSURL URLWithString:BASE_URL]];
[urlRequest setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];


[parameters enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSString *object, BOOL *stop) {
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@",object] dataUsingEncoding:NSUTF8StringEncoding]];
}];


[imagesData enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSData *object, BOOL *stop) {
    if ([object isKindOfClass:[NSData class]]) {
        if (object.length > 0) {
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            NSString *timeSTamp = [NSString stringWithFormat:@"%@",[NSDate date]];
            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpg\"\r\n",key,timeSTamp] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[NSData dataWithData:object]];
        }

    }
}];


[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPBody:body];


AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = nil;

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:urlRequest completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
        completionBlock (NO, responseObject);
    } else {
        NSLog(@"success");
        completionBlock (YES, responseObject);
    }
}];
[dataTask resume];
}

Upvotes: 3

ManiVasanth
ManiVasanth

Reputation: 86

Here i am using Afnetworking for Uplaoding image us Multipart format, its working fine. So, check it. If its ok for you just vote my answer.

#import "AFHTTPSessionManager.h"

{ 
  NSData * profileData;
}


   profileData = UIImageJPEGRepresentation(chosenImage, 1.0);

-(void)UploadImageApi
  {

   NSString *URLString = @“YourURL”;
   /*Profile data is nothing your pick image from gallery or Camera, That saving in profile data.*/

NSMutableDictionary *parameter=[[NSMutableDictionary alloc]init];

[parameter setObject:@“yourObj” forKey:@“YourKey”];
[parameter setObject:@“yourObj” forKey:@“YourKey”];

[parameter setObject:@“yourObj” forKey:@“YourKey”];


if(profileData==nil)
{
    [parameter setObject:@"" forKey:@“YourKey”];

}


AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
manager.responseSerializer = [AFJSONResponseSerializer
                              serializerWithReadingOptions:NSJSONReadingAllowFragments];
[manager POST:URLString parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

    if(profileData!=nil)
    {
        [formData appendPartWithFileData:profileData  name:@“YourKeyName” fileName:@"filename.jpg" mimeType:@"image/jpeg"];
    }

} 
      success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     NSLog(@"%@",responseObject);

          NSMutableArray *json = [responseObject mutableCopy];
                        NSLog(@" success = %@",json);


 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
     NSLog(@"%@",error);

 }];
}

Upvotes: 1

Related Questions