我正在使用 AFNetworking 上传照片,但遇到臭名昭著的“请求正文流耗尽”错误。
这是我的代码:
(_manager
是一个 AFHTTPRequestOperationManager
)
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
AFHTTPRequestOperation *operation = [_manager POST:address parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:imageData name:@"file" fileName:@"image.jpg" mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success!");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Written: %lld", totalBytesWritten);
}];
我在使用 wifi 和 4G/3G 的 iPhone 5S 和 iPhone 4 上都遇到了错误。这个问题是一致的,每次都会发生,就在上传应该完成的时候。奇怪的是它过去也适用于这些手机,但几天前我突然开始收到错误消息。此外,我的同事在他的 iPhone 5 上没有任何问题,无论是在 wifi 还是 4G 上,运行相同的代码。所有手机都运行 iOS 7。
我知道有些人在使用 3G 时遇到此错误,在这种情况下的解决方案是使用 throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes delay:(NSTimeInterval)delay
方法。但是,这对我的情况没有影响,我在 wifi 和移动设备上都遇到了错误。
我可以在同一网络上的计算机上使用 curl
执行上传。
最佳答案
我终于在这个答案中找到了解决方案: https://stackoverflow.com/a/21304062/569507
但是,我没有按照建议对 AFHTTPRequestOperation
进行子类化,而是简单地在其上创建了一个类别(或者实际上在其父类 AFURLConnectionOperation
上实现了 NSURLConnectionDataDelegate
协议(protocol))包含 connection:needNewBodyStream
方法。这就是所有需要的。我的其余代码保持不变。
AFURLConnectionOperation+Recover.h
#import "AFURLConnectionOperation.h"
@interface AFURLConnectionOperation (Recover)
- (NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request;
@end
AFURLConnectionOperation+Recover.m
#import "AFURLConnectionOperation+Recover.h"
@implementation AFURLConnectionOperation (Recover)
- (NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request
{
if ([request.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) {
return [request.HTTPBodyStream copy];
}
return nil;
}
@end
关于ios - 使用 AFNetworking 上传照片时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24852773/