【问题标题】:NSMutableURLRequest and "request body stream exhausted" errorNSMutableURLRequest 和“请求正文流耗尽”错误
【发布时间】:2011-05-20 13:26:56
【问题描述】:

我在将 http PUT 请求和请求正文作为来自文件的流时遇到问题。

无论文件大小如何,我都会收到错误“NSURLErrorDomain -1021 request body stream exhausted”

我知道我可以通过实现该方法来解决这个问题:

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

但这种方法不好,因为它会再次上传整个文件,而 40 MB 的文件原来是 80 Mb 的数据传输。

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

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

这是我的代码,简单且类似于 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];

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

【问题讨论】:

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


    【解决方案1】:

    从外观上看,您似乎没有在标题中设置@“Content-Length”。

    我的做法是这样的:

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

    无论哪种方式,我都在进行批量上传,偶尔会遇到正文流耗尽错误。据我所知,问题是我的设备上只有很少的可用空间,并且在一些上传完成之前临时文件会被自动删除(当收到错误时,我测试了文件是否仍然存在,并且不是)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多