【发布时间】:2014-06-17 11:22:23
【问题描述】:
我知道这个问题在这个网站上很受欢迎,但是在搜索了大部分答案后,我找不到解决方案。
我的应用程序是将图像上传到远程 url。我尝试了几种上传方式,都成功了:
(1) 使用 AFURLSessionManager
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[(AFHTTPResponseSerializer*)manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"multipart/form-data", nil]];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSDictionary *userInfo=[error userInfo];
id responseError=[userInfo objectForKey:@"AFNetworkingOperationFailingURLResponseErrorKey"];
if ([responseError isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *reponse=(NSHTTPURLResponse*)responseError;
if (reponse.statusCode==200) {
result(YES);
} else {
result(NO);
}
} else {
result(NO);
}
} else {
result(YES);
}
}];
[uploadTask resume];
为此,我使用 KVO 来监控进度,但没有运气。
(2) 使用AFHTTPRequestOperation
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"total bytes written: %lld",totalBytesWritten);
}];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
result(YES);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (operation.response.statusCode==200) {
result(YES);
} else {
result(NO);
}
}];
[operation start];
仅在开始上传时立即显示日志“写入的总字节数:”一次,文件体积为 100%。
(3) 使用 AFHTTPRequestOperationManager
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success %@", responseObject);
result(YES);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (operation.response.statusCode==200) {
result(YES);
} else {
result(NO);
}
}];
// 4. Set the progress block of the operation.
[operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten,
long long totalBytesWritten,
long long totalBytesExpectedToWrite) {
double percentDone = (double)totalBytesWritten / (double)totalBytesExpectedToWrite;
NSLog(@"progress updated(percentDone) : %f", percentDone);
}];
// 5. Begin!
[operation start];
=> 与第二个解决方案的结果相同。
请注意,所有解决方案都已成功上传,但进度未更新(NSProgress 或阻止)。
【问题讨论】:
标签: ios objective-c