Cocoa HTTP使用content-range进行PUT请求

3
有没有可能使用NSURLConnection/NSURLRequest组合来发送带Content-Range头的PUT请求到服务器?我的意思是我想恢复上传到服务器,该服务器可以接受请求中的字节范围以恢复上传。
我知道你可以将NSInputStream设置为请求正文,所以我想我可以子类化它并覆盖打开/寻找函数并设置请求头,但它似乎调用了未记录的选择器并破坏了实现。
我确信我可以使用CFNetwork来完成这个任务,但似乎有更高级别的API可以完成此项工作。
有任何想法从哪里开始吗?
编辑:
回答我的问题,通过阅读一篇博客[http://bjhomer.blogspot.com/2011/04/subclassing-nsinputstream.html],可以实现这一点,该博客详细介绍了与CFStream相关的未记录的回调。一旦实现了这些回调,我可以在open回调中调用以下内容以跳过先前已经上传的字节数:
CFReadStreamSetProperty((CFReadStreamRef)parentStream, kCFStreamPropertyFileCurrentOffset, (CFNumberRef)[NSNumber numberWithUnsignedLongLong:streamOffset]);

感谢您,J。

注意:没有必要降到 CF 级别:-[NSStream setPorperty:forKey:] 可以很好地解决这个问题!在那里使用的关键是 NSStreamFileCurrentOffsetKey,它自 OS X 10.3 以来就存在,并且在 iOS 2.0 上也是如此。 (请参见 NSStream 文档中的 "Constants" 部分) - danyowdee
完美,这正是我所需要的!如果您将其作为答案添加,我会接受它。谢谢。 - JWood
3个回答

6

我认为服务器需要支持将put方法与范围结合使用,但这将是使用高级Objective-C API的方法。

        NSURL *URL = [NSURL URLWithString:strURL];
        NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:URL];
        NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld",bytesUploaded,uploadSize];
        [urlRequest addValue:range forHTTPHeaderField:@"Range"];
        [urlRequest setHTTPMethod:@"PUT"];
        self.connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];

干杯


谢谢,以上基本正确,但问题出在输入流上。文档说:“整个流的内容将作为主体发送,就像HTTP POST请求一样。inputStream 应该未打开,接收方将接管流的委托。”这是不理想的,我需要流定位到正确的偏移量并从那里发送。 - JWood

2

首先,如果您想在HTTP方面进行高级工作,我通常推荐ASIHTTPRequest。它是可靠的东西,可以简化许多更复杂的HTTP问题。对于设置简单的标头并不真正需要它,但如果您开始构建更复杂的东西,尽早转到ASI可能会很好。

使用NSMutableURLRequest,您可以使用addValue:forHTTPHeaderField:设置任何标头。您可以使用它来设置您的Content-Range


2
我已经在使用ASIHTTPRequest,但由于它不再得到支持和开发,我正在放弃它。然而,它也存在同样的问题,即设置头部是可以的,但整个流被发送为请求体,这是不正确的。我需要以某种方式寻找流的正确字节偏移量,并仅发送剩余的字节。 - JWood

1

就像我在评论中发布的那样,您可以在不降低到CoreFoundation级别的情况下实现所需的功能:

由于NSInputStream继承了NSStream,因此可以按照以下方式准备流:

NSNumber *streamOffset = [NSNumber numberWithUnsignedInteger:lastOffset];

[inputStream setProperty:streamOffset forKey: NSStreamFileCurrentOffsetKey];

(假设lastOffset是以字节为单位的最后一个文件偏移量的NSUInteger表示,而inputStream是您想要设置为请求的HTTPBodyStream的流。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接