NSMutableURLRequest和“请求正文流耗尽”错误

时间:2010-12-05 15:31:49

标签: ios objective-c cocoa-touch network-programming nsmutableurlrequest

我的http PUT请求和请求正文是来自文件的流。

无论文件的大小如何,我都会收到错误“NSURLErrorDomain -1021请求正文流耗尽”

我知道我可以通过实现方法来覆盖这个问题:

-(NSInputStream*)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request

但这种方法并不好,因为它会再次上传整个文件,而40 MB的文件最终会产生80 Mb的数据传输。

如果我使用与NSData相同的文件并设置请求体,它可以正常工作。

我尝试发送请求Async并在两者中同步相同的结果。

这是我的代码,简单且类似于Apple的例子:

NSURL *url = [NSURL URLWithString:[self concatenatedURLWithPath:path]];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
[req setHTTPMethod:@"PUT"];
[req setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setTimeoutInterval:DEFAULT_TIMEOUT];
[req setValue:_contentType forHTTPHeaderField:@"Content-Type"];
NSInputStream *fileStream = [NSInputStream inputStreamWithFileAtPath:_dataStreamLocation];

[req setHTTPBodyStream:fileStream];
_connection = [[NSURLConnection connectionWithRequest:req delegate:self] retain];

我做错了吗? 我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

从它的外观来看,似乎你没有在标题中设置@“Content-Length”。

我这样做是这样的:

NSUInteger fileSize = [[[[NSFileManager defaultManager] attributesOfItemAtPath:_dataStreamLocation error:nil] objectForKey:NSFileSize] unsignedIntegerValue];
[request setValue:[NSString stringWithFormat:@"%u", fileSize] forHTTPHeaderField:@"Content-Length"];

无论哪种方式,我都在进行批量上传,偶尔会出现身体流消耗错误。据我所知,问题是我在设备上只有很少的可用空间,临时文件会在一些上传完成之前被自动删除(当我收到我测试的错误以检查文件是否仍在那里时,它不是。)

答案 1 :(得分:1)

我遇到了同样的问题,为我修复的是保留流然后在异步HTTP事务结束时释放它。似乎这不应该是必要的,但它让我解决了这个问题。