ios - 如何使用 NSURLSession 发布一些属性和图像

标签 ios nsurlsession

我有一个 node.js 作为后端服务器。它有一个 post 方法接受标题参数和纬度和经度参数以及图像。所以,我不仅发布了一张图片,还发布了其他参数。在 node.js 中, 标题 -> uitextview 的文本 纬度和经度 -> clocation 和一张图片。

node.js对应的方法是一个表单。

如何使用 NSURLSessionUploadTask 将它们发布到服务器。

最佳答案

带有附加参数的文件上传通常使用内容类型等于 multipart/form-data 的 HTTP 消息来完成。有关引用,请参阅 Form-based File Upload in HTML, RFC 1867 .

多部分/表单数据主体由一个多个“部分”组成,每个部分都有一个配置 header 和一个可选的内容类型 header 。一部分包含文件数据以及相应的内容类型 header ,另一部分(或多个部分)包含参数。包含参数的部分可能具有 application/x-www-form-urlencoded 的内容类型,其中正文由编码参数组成,或者可能是 JSON 或服务器支持的任何内容。每个单独的参数也可以表示为一个单独的部分。

这里的难点在于 正确组合 正文是一组部分的 HTTP 消息。 Cocoa 或 iOS 不直接支持组合多部分表单数据消息。也就是说,您可以尝试自己手动将这些消息的各个部分组合起来。

然而,这种技术是复杂的并且容易出错,如果您努力在所有相关的 HTTP 和 MIME 规范方面做到正确,您需要通读近 100 个 RFC 并彻底理解它们,然后在底层实现中煞费苦心地应用该规范。 (请帮自己一个忙,不要尝试这个!)

虽然在一天结束时,您可能会发现自己将多个部分组合成一条消息相对容易(SO 上有几个示例可以证明这一点),但当您想要利用时也有棘手的部分NSStreams 作为一个部分的“虚拟”主体,比如您要使用的文件流,因为创建一个 NSData 对象在分配的内存量方面似乎成本太高。

因此,当您有能力将 HTTP 消息的完整主体(由多个部分组成)组合成一个 NSData 对象时,实现此目的的努力可能是中等偏低。否则,如果您无法将图像数据和整个 body 保存到内存中,我强烈建议使用能够使用 NSStream 作为 body 部位的“数据源”的第三方库。

我的回答 here 中更详细地描述了如何编写多部分/表单数据消息。 . SO上的相关问题也数不胜数。

对于支持使用 NSStream 作为数据源构建 body 部位的第三方库,请查看 AFNetworking ,也可能是MKNetworkKit (还不支持 NSURLSession)

关于ios - 如何使用 NSURLSession 发布一些属性和图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19789013/

相关文章:

image - 如何在分配之前确保下载的数据不同

swift - 快速解析多范围请求响应

ios - 没有图像的自动布局 UIImageView

ios - 将 GMSMarker 添加到 map 时,应用程序仅在 iPhone 5 上崩溃 : EXC_BAD_ACCESS

ios - 处理 NSURLSessionDownloadTask 失败

swift - Swift 中 Watchkit 扩展 NSURLSession 的问题

swift - 如何等待 dataTaskWithRequest 完成 - Swift?

ios - UIVisualEffectView 和 UITableView

ios - SQLite 持久化项目 : errorMsg

ios - 上次操作后操作无效