带有附加参数的文件上传通常使用内容类型等于的 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,可能还有MKNetworkKit(NSURLSession
尚不支持)