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

时间:2013-11-05 12:27:50

标签: ios nsurlsession

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

node.js对应的方法是一种形式。

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

1 个答案:

答案 0 :(得分:3)

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

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

这里的难点在于HTTP消息的正确组合,其主体是一组部件。 Cocoa或iOS没有直接支持编写多部分表单数据消息。也就是说,您可以尝试亲自从部件中撰写此消息。

然而,这种技术经过精心设计并且容易出错,如果您努力在所有相关的HTTP和MIME规范上保持正确,您需要阅读几乎100个RFC并彻底理解它们,然后在底层实现中煞费苦心地应用该规范。 (拜托,帮个忙,不要试试!)

虽然在一天结束时,可能会发现自己从部分组成消息相对容易(这里有很少的例子可以证明这一点),当你想利用它时也有一个棘手的部分NSStreams作为部件的“虚拟”主体,比如说要使用的文件流,因为创建NSData对象在分配内存量方面似乎太昂贵了。

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

在我的回答here中更详细地描述了如何撰写multipart / form-data消息。 SO上还有无数的相关问题。

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