ios - 使用 AFNetworking 上传照片时出错

标签 ios cocoa-touch afnetworking multipartform-data afnetworking-2

我正在使用 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/

相关文章:

ios - 如何使用 AFNetworking 2.0 发布数据?

ios - touchesbegan 用于关闭 ScrollView 下的键盘 TextView 不起作用

swift - 无法在 AVPlayerViewController 纵向模式下隐藏状态栏

iphone - AFNetworking、AFHTTPRequestOperation 完成 block 缓慢触发代码

ios - 将 "Final"NSOperation 添加到操作次数不确定的队列中

ios - ScrollView +分段按钮+iOS

ios - 如何设置自调整单元格 iOS8

ios - 从 XCode 4.2 到 4.3,新的 ViewController 类 .m 文件的定义不同。为什么?

ios - 如何对 AFNetworking 请求进行单元测试

ios - 相机设置的 Swift 可选类型错误