通过HTTP POST发送大文件的正确方式是什么,而不是将整个文件加载到内存中?

我目前正在研究一个应用程序,通过简单的http后,从iPhone上传大video文件到web服务。 截至目前,我build立一个NSURLRequest并在加载请求之前预加载所有的video文件数据。 如果文件相当大,这自然会吃掉大量的内存,在某些情况下甚至是不可能的。

所以基本上我的问题是:有没有一个正确的方式来stream式传输数据或加载它没有应用程序的任何修改的networking服务器?

谢谢。

编辑澄清:我正在寻找一种方法来stream大型多部分/表单数据 iPhone networking服务器。 而不是周围的其他方式。

编辑后接受答案:我刚刚发现,苹果有一些漂亮的源代码编写的确切目的,它显示附加额外的数据,而不仅仅是大文件本身。 有人需要它: SimpleURLConnections – PostController.m

还有一个编辑:当使用苹果的源代码片段时,我遇到了一个非常愚蠢和丑陋的问题,即使wireshark也无法帮助我debugging。 一些networking服务器在引号之间声明时不理解边界string(如苹果示例)。 我在Apache Tomcat上遇到了问题,删除了引用的function非常棒。

你可以在NSMutableURLRequest上使用NSInputStream 。 例如:

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:uploadURL]; NSInputStream *stream = [[NSInputStream alloc] initWithFileAtPath:filePath]; [request setHTTPBodyStream:stream]; [request setHTTPMethod:@"POST"]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]); }]; 

您可以使用NSInputStream来提供数据通过-[NSMutableURLRequest setHTTPBodyStream:] 。 这可能是从文件中读取的inputstream。 您可能需要在URL连接委托中实现connection:needNewBodyStream:方法,以在系统需要重新传输数据时提供新的未打开的stream。

一种方法是使用与文件一致的asynchronousNSInputStream。 当asynchronous连接要求您提供更多数据时,可以从文件中读取数据。 你有几种方法来做到这一点:

  • UNIX / BSD接口。 使用open(或fopen),malloc,读取并从malloced数据创build一个NSData对象

  • 如果你知道的话,使用mmap()

  • 使用Foundation类的NSFileHandle API来做或多或less相同的使用ObjectiveC

您可以在“stream程编程指南”中阅读stream媒体。 如果这不适合你,那么有很多可以上传文件的开源项目,例如MKNetworkKit