使用 NSURLSession 上传多张图片

Posted

技术标签:

【中文标题】使用 NSURLSession 上传多张图片【英文标题】:Uploading multiple images using NSURLSession 【发布时间】:2016-08-23 10:35:09 【问题描述】:

我正在尝试上传用户选择的图像数组。它们是 base64 编码的。我收到来自服务器的空响应。下面是我的代码。

for (PHAsset *asset in assets) 

[manager requestImageForAsset:asset  targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:self.requestOptions resultHandler:^void(UIImage *image, NSDictionary *info) 


   NSString *encodeStr = [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];      

  [images addObject:encodeStr];

   ];

我正在使用 QBImagePickerController 从委托中获取图像。我有一个 NSMutableDictionary 作为 NSMutableURLRequest 的正文内容。

[uploadObject setValue:@"32" forKey:@"userid"];        
[uploadObject setValue:TFname.text forKey:@"Name"];        
[uploadObject setObject:images forKey:@"SelectedImages"];        


JSONData = [NSJSONSerialization dataWithJSONObject:uploadObject options:NSJSONWritingPrettyPrinted error:nil];

这里是NSMutableURLRequest

request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

[request setValue:@"JSON" forHTTPHeaderField:@"Content-Type"];

[request setHTTPBody:JSONData];

我收到一个服务器响应代码 500 和来自服务器的空响应。我已经尝试过NSURLSessionDataTaskNSURLSessionUploadTask。 任何帮助都会有好处!

【问题讨论】:

你能告诉我们你的网址格式吗? NSURL *url = [NSURL URLWithString:uploadURL]; , uploadURL = @"www.xxx.com"; 这是网址。 图片应作为多部分表单数据上传!!不像 base64Encoded 字符串!! 参考http://***.com/questions/24250475/post-multipart-form-data-with-objective-c 参考this ..它可能会有所帮助 【参考方案1】:

如果不查看服务器端代码,则无法确定此代码是否正确。看起来您正在向服务器发送以下内容:


  "userid" : "32",
  "Name": "someFilename",
  "SelectedImages": [
      "base64-encoded-data-of-first-image",
      "base64-encoded-data-of-second-image",
      ...
  ]

如果您的服务器了解如何解析 JSON 请求正文并获取具有这些名称的字段,那么它应该可以正常工作。但是,格式似乎不太可能是正确的,因为您传递的多个图像似乎是单个文件名。

如果您正在使用现有的服务器代码,则需要找出它期望数据采用的格式。如果您正在编写自己的服务器代码,您可能应该将数据结构更像这样:


  "userid" : "32",
  "SelectedImages": [
     
        "name": "firstFilename",
        "data": "base64-encoded-data-of-first-image"
     ,
     
        "name": "secondFilename",
        "data": "base64-encoded-data-of-second-image"
     ,
      ...
  ]

【讨论】:

这对我也不起作用。服务器希望它以我的方式发送。 无论哪种方式,问题是您没有以服务器期望的形式发送它(例如,您确定它需要 JSON 吗?)或者服务器端存在错误。您的客户端代码很好。 更正:您的内容类型可能有误。尝试应用程序/json。 我再次收到空响应和状态 200。【参考方案2】:

我终于在不久前发现了这个问题。

问题出在服务器端。

【讨论】:

以上是关于使用 NSURLSession 上传多张图片的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 快速上传多张图片

php中上传多张图片,如何解决?

如何使用 HTTP 将多张图片上传到 Flutter 中的 Rest API?

使用 AFNetworking 上传多张图片

NSURLSession下载文件-代理

Shopify API Python 使用 Python API 上传多张图片