AFNetworking 3 AFMultipartFormData getting bytes data in response

◇◆丶佛笑我妖孽 提交于 2020-01-14 04:43:08

问题


I'm doing this to send images in an array to server:

NSString *string = [NSString stringWithFormat:@"%@/API/Upload",BaseURLString];
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:BaseURLString]];

    [manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
    [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];

    for(NSData *eachImage in self.fetchedAtt) {
    [manager POST:string
       parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

    [formData appendPartWithFormData:eachImage
                                name:@"image1"];

}

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

              if (responseObject != nil)
              {
                  //NSDictionary *jsonDictionary = responseObject;
                  NSLog(@"%@",responseObject);
              }
          }

          failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

              NSLog(@"%@",error.localizedDescription);
          }];
    }

For now I only send one image to test. And it get responseObject which is bytes data.

<696d6167 65313a20 efbfbdef bfbdefbf bdefbfbd 00104a46 49460001 01000048 00480000 efbfbdef bfbd0058 45786966 00004d4d 002a0000 00080002 01120003 00000001 00010000 efbfbd69 00040000 00010000 00260000 00000003 efbfbd01 00030000 00010001 0000efbf bd020004 00000001 0000001e efbfbd03...

As per the web guy response should be the URL of the image. Web backend is in ASP.NET What am I doing wrong?

UPDATE
If I change the response serializer I get:

Request failed: unacceptable content-type: application/octet-stream

I've even tried this:

NSString *string = [NSString stringWithFormat:@"%@/API/Upload",BaseURLString];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
NSError *error;

for(NSData *eachImage in self.fetchedAtt) {

    NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:string parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        //NSString *value = @"qux";
        //NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];

//[formData appendPartWithFormData:eachImage name:@"image1"]; [formData appendPartWithFileData:eachImage name:@"image1" fileName:@"test.jpg" mimeType:@"image/jpeg"]; } error:&error];

    NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error.localizedDescription);
            return;
        }

        NSLog(@"%@", responseObject);
    }];
    [task resume];
}

But got Request failed: internal server error (500). if I uncomment the appendPartWithFormData and comment other line I get same bytes in responseObject.

More Updates:
We tested it on postman and the image was uploaded successfully. But if I give something in parameter I get

Request failed: unsupported media type (415)


回答1:


When you upload images, you'd expect some response from the server (just to acknowledge that they were received successfully). Having said that, looking at your hex data, it's curious. What it looks like is:

The "JFIF" and "Exif" references are consistent with a JPEG response. And the image1 looks like it was the name of the image you sent. But this is a very curious response. It's definitely not the URL of the image.

You should contact the web service authors and get details of what precisely they're sending back, because it doesn't conform to standard responses (XML, JSON, etc.).


By the way, your method of uploading the image looks incorrect. You'd usually do something like:

[formData appendPartWithFileData:eachImage
                            name:@"image1"
                        fileName:@"test.jpg"
                        mimeType:@"image/jpeg"];

Clearly, you'd specify the fileName and mimeType to match what the NSData really was. And I'd double check with the author of the web service whether they really want to use a field name of image1 ... that's a little atypical.



来源:https://stackoverflow.com/questions/40424323/afnetworking-3-afmultipartformdata-getting-bytes-data-in-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!