0

Я пытаюсь загрузить изображение на свой AWS-сервер с использованием multipart form afnetworking 3.0, но, судя по всему, каждое изображение, которое я пытался загрузить, попало в блок отказов. Коды, написанные в объективе c.AFNetworking 3.0 Многостраничные данные формы для загрузки ошибки изображения

- (NSURLSessionUploadTask *)uploadImageTask:(NSMutableDictionary *)dictionary 
{ 
    NSString *s3BucketUrl = [dictionary objectForKey:@"s3BucketUrl"]; 

    NSData *imageData = [dictionary objectForKey:@"imageData"]; 

    NSString *contentType = [dictionary objectForKey:@"contentType"]; 

    NSString *filename = [dictionary objectForKey:@"filename"]; 

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

     [formData appendPartWithFileData:imageData name:@"file" fileName:filename mimeType:contentType]; 
    } error:nil]; 

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

    NSURLSessionUploadTask *uploadTask = [[NSURLSessionUploadTask alloc] init]; 
    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) { 

          if (self.delegate != nil && [self.delegate respondsToSelector:@selector(onUploadImageTask:)]) 
          { 
           [self.delegate onUploadImageTask:nil]; 
          } 

         } else { 

          if (self.delegate != nil && [self.delegate respondsToSelector:@selector(onUploadImageTask:)]) 
          { 
           [self.delegate onUploadImageTask:error]; 
          } 
         } 
        }]; 

    [uploadTask resume]; 

    return uploadTask; 
} 

Ошибка я получаю

Ошибка домена = com.alamofire.error.serialization.response Code = -1011 "Ошибка запроса: плохой запрос (400)" UserInfo = {NSUnderlyingError = 0x170248940 {Ошибка домена = com.alamofire.error.serialization.response Код = -1016 "Ошибка запроса: неприемлемый тип содержимого: application/xml" UserInfo = {com.alamofire.serialization.response.error.response = { URL: https://....s3.amazonaws.com/} {код состояния: 400, заголовки { Connection = закрыть; "Content-Type" = "application/xml"; Дата = "Вт, 20 дек. 2016 01:53:47 GMT"; Сервер = AmazonS3; «Передача-кодирование» = Идентичность; "x-amz-id-2" = "....."; "x-amz-request-id" = ....; }},

Я попытался изменить тип содержимого для сериализатора ответа и все еще не удалось.

+0

пытался октет-поток, как контент-тип? – Joshua

+0

@ Joshua как продолжить octet-stream как тип контента и что он делает? –

+0

Хорошее объяснение будет здесь: https://www.reference.com/technology/octet-stream-ecf0fe1dd4c152a0 и на основании ошибки кажется, что сервер, на который вы отправляете, не принимает приложение/xml – Joshua

ответ

1

Используйте этот метод

-(void)callWebserviceToUploadImageWithParams:(NSMutableDictionary *)_params imgParams:(NSMutableDictionary *)_imgParams videoParms:(NSMutableDictionary *)_videoParams action:(NSString *)_action success:(void (^)(id))_success failure:(void (^)(NSError *))_failure 

{ 
    if ([[AFNetworkReachabilityManager sharedManager] isReachable]) { 
     //Here BASE_URL is my URL of web service 
     NSString *urlString = [BASE_URL stringByAppendingString:_action]; 
     NSLog(@"URL : %@",urlString); 
     NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init]; 
     [urlRequest setURL:[NSURL URLWithString:urlString]]; 
     [urlRequest setHTTPMethod:@"POST"]; 
     NSString *boundary = @"---------------------------14737809831466499882746641449"; 
     NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
     [urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
     // [urlRequest setValue:contentType forHTTPHeaderField:@"Content-type: application/json"] 
     NSMutableData *body = [NSMutableData data]; 
     [_params 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]]; 
     }]; 
     [_imgParams 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]]; 
        NSLog(@"Timestamp:%@",TimeStamp); 
        [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]]; 
       } 

      } 
     }]; 
     [_videoParams enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSData *object, BOOL *stop) { 
      if (object.length > 0) { 
       [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
       NSLog(@"Timestamp:%@",TimeStamp); 
       [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.mp4\"\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); 
       if(_failure) 
       { 
        _failure(error) ; 
       } 
      } else { 
       if(_success) 
       { 
        _success(responseObject) ; 
       } 
      } 
     }]; 
     [dataTask resume]; 
    } 
    else 
    { 
     [Utility showInterNetConnectionMessage]; 
     NSError *error; 
     if(_failure) 
     { 
      _failure(error) ; 
     } 
    } 
} 

Если вы не публикуете любое видео или изображение, а затем дать как ноль

ПРИМЕНЕНИЕ:

#pragma -mark callwebservice for login 
    -(void)callWebserviceFor_upload_Sticker { 
    // Check whether Company user login or Individual User login. 
    [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeClear]; 

    //user_id, user_token, emoji_weburl(optional), emoji_picture(file) 
    NSMutableDictionary *dict_user_data = [Utility getUserPlistData]; 
    NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; 
    [params setValue:[dict_user_data valueForKey:@"user_id"] forKey:@"user_id"]; 
    [params setValue:[dict_user_data valueForKey:@"user_token"] forKey:@"user_token"]; 
    NSLog(@"%@",params); 

    NSMutableDictionary *imgParams = [[NSMutableDictionary alloc]init]; 
    [imgParams setValue:UIImageJPEGRepresentation(img_to_upload, 0) forKey:@"emoji_picture"]; 

    void (^successed)(id _responseObject) = ^(id _responseObject) 
    { 
     NSLog(@"%@",_responseObject); 
     //Your logic after success 
    } ; 
    void (^failure)(NSError* _error) = ^(NSError* _error) { 
     [SVProgressHUD showErrorWithStatus:@"Failed"]; 
    } ; 

[[WebServiceHendler sharedManager]callWebserviceToUploadImageWithParams:params imgParams:imgParams videoParms:nil action:UPDATE_EMOJI success:successed failure:failure]; 
}