我目前正致力于通过简单的http帖子将大型视频文件从iPhone上传到网络服务的应用程序。截至目前,我在加载请求之前构建了NSURLRequest并预加载了所有视频文件数据。如果档案相当大,这自然会占用大量的公羊,在某些情况下甚至不可能。
所以基本上我的问题是:是否有正确的方式来流式传输数据或将其加载到块中而不对网络服务器进行任何修改?
感谢。
编辑澄清:我正在寻找一种方法来流式传输大型多部分/表单数据 FROM iPhone TO 一个网络服务器。不是另一种方式。
接受回复后编辑:我刚刚发现苹果为此目的编写了一些漂亮的源代码,它显示了向帖子附加额外数据,而不仅仅是大文件本身。任何人都需要它:SimpleURLConnections - PostController.m
还有另一个编辑:在使用source code from apple那段时,我遇到了一个非常愚蠢和丑陋的问题,即使是wireshark也无法帮我调试。一些Web服务器在引号之间声明它时不理解边界字符串(例如在apples示例中)。我在Apache Tomcat上遇到了问题并删除了引用效果非常好。
答案 0 :(得分:14)
您可以NSInputStream
使用NSMutableURLRequest
。例如:
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]);
}];
答案 1 :(得分:3)
您可以使用NSInputStream
提供要通过-[NSMutableURLRequest setHTTPBodyStream:]
发布的数据。这可以是从文件读取的输入流。您可能需要在URL连接委托中实现connection:needNewBodyStream:
方法,以便在系统需要重新传输数据时提供未打开的新流。
答案 2 :(得分:2)
执行此操作的一种方法是使用与文件一致的异步NSInputStream。当异步连接要求您提供更多数据时,您将从文件中读取数据。你有几种方法可以做到这一点:
UNIX / BSD接口。使用open(或fopen),malloc,read,并从malloced数据创建NSData对象
如果你知道的话,使用上面的mmap()
使用Foundation类NSFileHandle API使用ObjectiveC执行大致相同的操作
您可以在“流编程指南”中阅读流。如果这对您不起作用,则有许多可以上传文件的开源项目,例如MKNetworkKit