我需要从我的 iphone 上传大文件,比如视频。基本上我需要将数据作为块读取并上传每个块。我的上传是分段上传。如何使用 NSURLConnection 实现这一点?
提前致谢!
我需要从我的 iphone 上传大文件,比如视频。基本上我需要将数据作为块读取并上传每个块。我的上传是分段上传。如何使用 NSURLConnection 实现这一点?
提前致谢!
您可能会使用“基于表单的 HTML 文件上传”。这是 multipart/form-data POST 请求的一种特殊形式。
请参阅HTML 中基于表单的文件上传和网络中的许多其他来源。
在处理大文件时,您需要努力将内存占用保持在可接受的低水平。因此,请求数据的输入源应该是NSInputStream
正好可以避免这个问题的。您使用类工厂方法创建一个实例,NSInputStream
您可以在其中指定要上传的文件。设置时,NSMutableURLRequest
您通过设置输入流setHTTPBodyStream
。
无论如何,NSURLConnection
在实现委托的异步模式下使用。如果需要,您将需要保留连接对象的引用以便能够取消它。
每个多部分都应该有一个 Content-Type - 尤其是文件部分 - 并且每个部分都应该有一个 Content-Length,除非使用分块传输编码。
您可能希望使用正确的长度显式设置文件部分的 Content-Length 标头。否则,如果NSURLConnection
无法确定内容长度本身 - 当您设置输入流时这是真的 - 然后NSURLConnection
使用分块传输编码。根据内容类型,一些服务器可能难以处理分块传输编码的正文或非常大的正文。
由于移动设备在上传请求期间很有可能在现场断开连接,因此您还应该考虑使用“HTTP 范围标头”。服务器和客户端都需要支持这一点。请参阅“14.35 Range” RFC 2616以及有关“可恢复文件上传”的各种其他来源。
没有系统框架可以帮助您设置多部分正文并计算整个消息的正确内容长度。在没有第三方库支持的情况下自行执行此操作非常容易出错且很麻烦,但可行。