2016-08-31 6 views
2

Я пытаюсь загрузить изображения на сервер с помощью AFNetworking 3.0.
Загрузка изображений с помощью AFNetworking 3.0

Вот мой код:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
    [[manager POST:setUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) 
    { 
     //Current date with image name 
     NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss a"]; 
     [formData appendPartWithFileData:image name:namePara fileName:[NSString stringWithFormat:@"img_%@",[dateFormatter stringFromDate:[NSDate date]]] mimeType:@"image/png"]; 
     }progress:nil 
     success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) 
     { 
      NSLog(@"%@",responseObject); 
      [GMDCircleLoader hideFromView:self.view animated:YES]; 
      NSMutableDictionary *dir = [[NSMutableDictionary alloc]initWithDictionary:responseObject]; 
      if([dir valueForKey:@"error"]) 
      { 
       UIAlertController *alert = [[singletone sharedManager]showAlert:NSLocalizedString(@"SIGNIN", nil) :[NSString stringWithFormat: @"%@",[dir valueForKey:@"error"]] ]; 
       [self.parentViewController presentViewController:alert animated:YES completion:nil]; 
      } 
      else 
      { 
       //Successfull 
       UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"REGISTRATION", nil) message:[dir valueForKey:@"success"] preferredStyle:UIAlertControllerStyleAlert]; 
       UIAlertAction* ok = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) 
       { 
        [self.navigationController popViewControllerAnimated:YES]; 
       }]; 
      [alertController addAction:ok]; 
      [self presentViewController:alertController animated:YES completion:nil]; 
      } 
      NSLog(@"response object : %@",responseObject); 
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {      NSLog(@"failure : %@",error.localizedDescription); 
    }]resume]; 


Он будет получать в успех блока с ошибки: Ошибка в Image Выгрузка.
Я также попробовал из Postman проверить свой ответ API, но он отлично работает с Postman. В чем проблема с этим кодом?

+1

Можете ли вы добавить скриншот почтальона, который делает API принимает файл как base64 или простой файл – gurmandeep

+0

Вы хотите показать ответ? –

+0

Да, пожалуйста. Будет хорошо – gurmandeep

ответ

0

вы пытаетесь это

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; 
+0

Я пытаюсь с manager.responseSerializer. acceptedContentTypes = [NSSet setWithObject: @ "application/json"]; но он по-прежнему не является расширением. а также дать мне ошибку BSMachError: (os/kern) недопустимая возможность (20) _BSMachError: (os/kern) неверное имя (15) –

+0

http://stackoverflow.com/questions/32899586/error-message-bsmacherror- os-kern-invalid-capability-20 – vaibby

0
NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString:imageBytes options:0]; 
NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:stringURL]];// Your API 

    [manager POST:stringURL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    { 
     //do not put image inside parameters dictionary as I did, but append it! 
     [formData appendPartWithFileData:nsdataFromBase64String name:fIds fileName:fileN mimeType:@"image/jpeg"]; 

    } 
    success:^(NSURLSessionDataTask *task, id responseObject) 
    { 
     [email protected]"success"; 
     //here is place for code executed in success case 
    } 
    failure:^(NSURLSessionDataTask *task, NSError *error) 
    { 
     [email protected]"fail"; 
     //here is place for code executed in error case 
    }]; 

прекрасно работает на моем конце

Это то, что вы используете в Почтальон enter image description here

+0

imageBytes - это nsdata? –

+0

Да, сначала я получаю imageBytes с сервера. И я меняю его обратно на NSData, чтобы синхронизировать изображение с сервером – gurmandeep

+0

Я получаю причину: «Неверный параметр не удовлетворяет: body –

0

Вам нужно установить requestSerializer на @ "многочастному/form-data "для @" Content-Type ".

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 


    manager.responseSerializer=[AFJSONResponseSerializer serializer]; 

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data"]; 
    [manager.requestSerializer setValue:contentType forHTTPHeaderField:@"Content-Type"]; 


    [manager POST:setUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { 
     NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss a"]; 
     [formData appendPartWithFileData:image name:namePara fileName:[NSString stringWithFormat:@"img_%@",[dateFormatter stringFromDate:[NSDate date]]] mimeType:@"image/png"]; 


    } progress:^(NSProgress * _Nonnull uploadProgress) { 

    } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 

     NSLog(@"%@",responseObject); 
      [GMDCircleLoader hideFromView:self.view animated:YES]; 
      NSMutableDictionary *dir = [[NSMutableDictionary alloc]initWithDictionary:responseObject]; 
      if([dir valueForKey:@"error"]) 
      { 
       UIAlertController *alert = [[singletone sharedManager]showAlert:NSLocalizedString(@"SIGNIN", nil) :[NSString stringWithFormat: @"%@",[dir valueForKey:@"error"]] ]; 
       [self.parentViewController presentViewController:alert animated:YES completion:nil]; 
      } 
      else 
      { 
       //Successfull 
       UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"REGISTRATION", nil) message:[dir valueForKey:@"success"] preferredStyle:UIAlertControllerStyleAlert]; 
       UIAlertAction* ok = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) 
       { 
        [self.navigationController popViewControllerAnimated:YES]; 
       }]; 
      [alertController addAction:ok]; 
      [self presentViewController:alertController animated:YES completion:nil]; 
      } 
      NSLog(@"response object : %@",responseObject); 
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
     NSLog(@"error: %@", error.localizedDescription); 

    }]; 
+1

все еще не сделано. Ошибка: «Ошибка при загрузке изображения»; –

+0

Share postman. Else это код. – gurmandeep

0
NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString:"your image as base64 encoded" options:0]; 

NSDictionary *parameters = [NSMutableDictionary dictionary]; 

parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"wr34", @"delivery_company_name", @"uname", @"user_name", @"123456789", @"contact_info", @"[email protected]", @"email",@"123456", @"password",@"SUV", @"car_type",@"White", @"car_color",@"GJ-1AE-2255", @"car_plate_no",@"43345dw", @"car_reg_no",@"123454", @"license_no",@"Model", @"car_model",@"location", @"location",@"4.3", @"latitude",@"8.7", @"longitude",@"notes", @"deliver_terms_conditions",@"notes", @"notes", nil]; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:stringURL]]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

[manager POST:stringURL parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
{ 
    //do not put image inside parameters dictionary as I did, but append it! 
    [formData appendPartWithFileData:nsdataFromBase64String name:@"ToyotaSupra" fileName:@"ToyotaSupra" mimeType:@"image/png"]; 

} 
     success:^(NSURLSessionDataTask *task, id responseObject) 
{ 
    [email protected]"success"; 
    //here is place for code executed in success case 
} 
     failure:^(NSURLSessionDataTask *task, NSError *error) 
{ 
    [email protected]"fail"; 
    //here is place for code executed in error case 
}]; 

загрузить рабочий код

https://www.dropbox.com/s/3ot6kpiqs3pn2h0/AFNetwork.zip?dl=0

+0

, какая версия использования вами была использована? –

+0

Работа над 3.0. – gurmandeep

+0

[менеджер POST: параметры stringURL : parameters constructiveBodyWithBlock:^(id formData) устарел из вашего кода. Я пытаюсь с тем же кодом, что он работает нормально, но после этого устаревшего предупреждения он не работает. –

1

Попробуйте ниже код и он работает с AFNetworking 3,0:

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 



    manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments]; 


    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:BaseURL parameters:<parameter dictionary> constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
            { 

             if (profile_pic.length!=0) { 

              [formData appendPartWithFileData:imageData name:@"profile_pic" fileName:@"ProfilePic" mimeType:@"image/jpeg"]; 
             } 


            } error:nil]; 

    NSURLSessionUploadTask *uploadTask; 
    uploadTask = [manager 
        uploadTaskWithStreamedRequest:request 
        progress:^(NSProgress * _Nonnull uploadProgress) { 
         // This is not called back on the main queue. 
         // You are responsible for dispatching to the main queue for UI updates 

        } 
        completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
         if (error) 
         { 


         } 
         else 
         { 

         } 
        }]; 

    [uploadTask resume]; 
+0

Я получил ответ успешно. но на сервере имя изображения не найдено, поскольку я отправляю i.e. profilepic –

+0

просто подтвердите свое имя параметра (имя: @ "profile_pic") правильно –

+0

Я согласен с этим параметром. но странно, что с моим исходным параметром он не работает, но с вашим параметром он работает. но не отображая имя изображения на сервере. –

Смежные вопросы