简体   繁体   中英

Unable to save picture in SignUp POST request with Afnetworking

I am trying to upload a picture on server with Multiparts using AFNetworking. I have tried to make a simple POST request without Image and it works fine. Now, can say that service URL is absolutely fine and there is no issue with server and I can see that image URL that is saved in document directory is also fine and all the other parameters are fine too, because they all are working with simple request. Can anyone find some error in my code? My Code is:

 (void)uploadPicture:(NSMutableDictionary *)param
 {


NSString *string=[NSString stringWithFormat:@"%@%@",base_url,@"register"];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:string parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:[NSURL fileURLWithPath:getImagePath] name:@"picture" fileName:getImagePath mimeType:@"image/jpeg" error:nil];
} error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
AFJSONRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
[serializer setStringEncoding:NSUTF8StringEncoding];


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
                  dispatch_async(dispatch_get_main_queue(), ^{
                      //Update the progress view

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

                      NSLog(@"Error: %@", error);
                  } else {
                      NSLog(@"%@ %@", response, responseObject);
                      NSDictionary *dict= [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                      NSDictionary *dic=responseObject;
                      NSLog(@"");
                  }
              }];

[uploadTask resume];

}
  NSString *string=[NSString stringWithFormat:@"%@%@",base_url,@"register"];

  @autoreleasepool {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager POST:strurl
    parameters:parameters
    constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
      NSMutableArray *allKeys = [[imgParameters allKeys] mutableCopy];

      for (NSString *key in allKeys) {
        id object = [imgParameters objectForKey:key];

        int timestamp = [[NSDate date] timeIntervalSince1970];
        NSString *str = [[NSString alloc] initWithFormat:@"%d", timestamp];
        NSString *ranstrin = [self randomStringWithLength:8];

        //                if ([key isEqualToString:@"image"]) {
        str = [NSString stringWithFormat:@"TestThumb_%d_%@.jpg",
                                         timestamp, ranstrin];

        [formData appendPartWithFileData:object
                                    name:key
                                fileName:str
                                mimeType:@"image/jpeg"];
      }

    }
    progress:^(NSProgress *_Nonnull uploadProgress) {

    }
    success:^(NSURLSessionDataTask *_Nonnull task,
              id _Nullable responseObject) {
      complete(responseObject, nil);
    }
    failure:^(NSURLSessionDataTask *_Nullable task,
              NSError *_Nonnull error) {
      complete(nil, error);

    }];

Try this function :

First Solution

Note : You need to customise as per your need

-(void)getResponeseWithURL:(NSString *)url WithParameter:(NSDictionary *)parameter WithImage:(UIImage *)image ImageArray:(NSMutableArray *)arrImage WithImageParameterName:(NSString *)imagename WithCallback:(void(^)(BOOL success, id responseObject))callback {
        NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@%@",BASEURL,url] parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            if (image) {
                [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 0.8) name:imagename fileName:@"Image.jpg" mimeType:@"image/jpeg"];
            }
            else if (arrImage){
                int i = 1;
                for (UIImage *recipeimage in arrImage) {
                    // this condition for maintain server side coloum format : ex name , name_2 , name_3
                    [formData appendPartWithFileData:UIImageJPEGRepresentation(recipeimage, 0.8) name:i == 1 ? imagename : [NSString stringWithFormat:@"%@_%d",imagename,i] fileName:@"Image.jpg" mimeType:@"image/jpeg"];
                    i++;
                }
            }

        }error:nil];

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

        manager.responseSerializer = [AFJSONResponseSerializer serializer];

        NSURLSessionUploadTask *uploadTask;
        uploadTask = [manager
                      uploadTaskWithStreamedRequest:request
                      progress:^(NSProgress * _Nonnull uploadProgress) {
                          dispatch_async(dispatch_get_main_queue(), ^{
                          });
                      }
                      completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                          if (error) {
                              [UtilityClass showAlertWithMessage: @"Please try again" andWithTitle:@"Network Error" WithAlertStyle:AFAlertStyleFailure];

                              NSLog(@"Error: %@", [[NSString alloc]initWithData:[[error valueForKey:@"userInfo"] valueForKey:@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding]);

                              [UtilityClass removeActivityIndicator];
                              callback(NO,nil);

                          } else {
                              callback(YES,responseObject);
                          }
                      }];

        [uploadTask resume];

}

Second

May you have forgot to add ATS in your project plist file so you need to add this .

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM