AFNetworking 3 AFMultipartFormData获取字节数据作为响应

时间:2016-11-04 13:47:09

标签: ios asp.net objective-c afnetworking multipartform-data

我这样做是为了将数组中的图像发送到服务器:

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);
          }];
    }

现在我只发送一张图片进行测试。它得到responseObject这是字节数据。

  

&lt; 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 ...

根据网络家伙的反应应该是图片的网址。 Web后端在ASP.NET我做错了什么?

更新
如果我改变响应序列化器,我得到:

  

请求失败:不可接受的内容类型:application / octet-stream

我甚至试过这个:

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”];         }错误:&amp;错误];

    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];
}

但得到了Request failed: internal server error (500)。如果我取消注释appendPartWithFormData并注释其他行,我会在responseObject中获得相同的字节。

更新更新:
我们在邮递员上测试了它,图像上传成功。但如果我在参数中给出一些东西

  

请求失败:不支持的媒体类型(415)

1 个答案:

答案 0 :(得分:1)

当您上传图片时,您需要服务器做出一些回复(只是为了确认它们已成功收到)。话虽如此,看看你的十六进制数据,它很奇怪。它看起来像是:

enter image description here

&#34; JFIF&#34;和&#34; Exif&#34;引用与JPEG响应一致。并且image1看起来像是您发送的图像的名称。但这是一个非常好奇的回应。它绝对不是图像的URL。

您应该联系网络服务作者,详细了解他们发回的内容,因为它不符合标准响应(XML,JSON等)。

顺便说一下,上传图片的方法看起来不正确。你通常会这样做:

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

显然,您指定fileNamemimeType以匹配NSData的真实情况。我要与网络服务的作者仔细检查他们是否真的想要使用image1的字段名称......这有点不典型。