0

I have a node.js as backend server. And it has a post method accept a title param and a latitude and longitude param and a image. So, I am not only post a image but with other params together. In the node.js, title -> uitextview's text latitude & longitude - > cllocation and a image.

the node.js corresponding method is a form.

How to use NSURLSessionUploadTask to post them to the server.

4

1 回答 1

3

带有附加参数的文件上传通常使用内容类型等于的 HTTP 消息来完成multipart/form-data。有关参考,请参阅HTML 中基于表单的文件上传,RFC 1867

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

这里的困难在于正确组合HTTP 消息,其正文是一组部分。Cocoa 或 iOS 不直接支持编写多部分表单数据消息。也就是说,您可以尝试自己手动编写此消息。

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

NSStreams虽然在一天结束时,可能会发现自己从部分中编写消息相对容易(SO 上的示例很少可以证明这一点),但当您想用作“虚拟”时,还有一个棘手的部分" 一个部分的主体,比如说你想要使用的文件流,因为创建一个NSData对象对于分配的内存量来说似乎太昂贵了。

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

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

对于支持使用 a 作为数据源构建身体部位的第三方库NSStream,请查看AFNetworking,可能还有MKNetworkKitNSURLSession尚不支持)

于 2013-11-05T14:34:44.420 回答