NSURLConnection上传大文件

时间:2013-07-09 06:47:32

标签: upload nsurlconnection multipartform-data

我需要从iphone上传大型文件,例如视频。基本上我需要将数据读取为块并上传每个块。我的上传是分段上传。如何使用NSURLConnection实现这一目标?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可能使用“基于表单的基于HTML的文件上传”。这是multipart / form-data POST请求的一种特殊形式 请参阅网络中的Form-based File Upload in HTML和许多其他来源。

处理大型文件时,您需要努力使内存占用率保持在低水平。因此,请求数据的输入源应该是NSInputStream,这可以精确地避免这个问题。您可以使用类工厂方法创建NSInputStream实例,并在其中指定要上载的文件。设置NSMutableURLRequest时,您可以通过setHTTPBodyStream设置输入流。

无论如何,在实现委托的异步模式下使用NSURLConnection。如果需要,您将需要保留连接对象的引用以便能够取消它。

除非使用分块传输编码,否则每个多部分都应具有内容类型 - 尤其是文件部分 - 并且每个部分应该具有内容长度。

您可能希望使用正确的长度显式设置文件部分的Content-Length标头。否则,如果NSURLConnection无法确定内容长度本身 - 并且在设置输入流时也是如此 - 则NSURLConnection使用分块传输编码。根据内容类型,一些服务器可能难以处理分块传输编码主体或非常大的主体。

由于移动设备在上传请求期间很有可能在现场断开连接,因此您还应考虑使用“HTTP范围标头”。服务器和客户端都需要支持这一点。 请参阅“14.35范围”RFC 2616以及有关“可恢复文件上传”的各种其他来源。

没有系统框架可以帮助您设置多部分正文并计算整个邮件的正确内容长度。在没有第三方库支持的情况下自己这样做是非常容易出错且麻烦的,但是可行。