使用 AFNetworking 2.0 从 iOS 应用程序以流的形式上传 100 张图像
Posted
技术标签:
【中文标题】使用 AFNetworking 2.0 从 iOS 应用程序以流的形式上传 100 张图像【英文标题】:Upload 100 images in a stream from iOS app with AFNetworking 2.0 【发布时间】:2015-04-13 11:41:23 【问题描述】:我想发送最大值。向我的服务器发出的单个请求中包含 100 张图像。简单的图片上传对我来说很好。
但我想用 AFNetworking 2.0 api 创建一个数据流。所以,我想问我如何用我的图像数据创建一个新的网络流。
此外,此流还应在应用程序的后台模式下工作,并且图像应在应用程序的后台模式下上传到服务器上。如何使用 AFNetworking 2.0 库实现此目的?
任何建议都会有所帮助。
【问题讨论】:
【参考方案1】:我认为这不是一个好主意,但我会回答你的问题,让你自己决定。
AFAIK 只有两种方法可以通过单个请求发送 100 张图像:
-
将它们绑定到一个文件中,例如压缩它们
使用 multipart/form-data
第一种方法很明显:)让我们谈谈第二种。
使用 AFNetworking 创建多部分请求:
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer]
multipartFormRequestWithMethod:@"POST"
URLString:[url absoluteString]
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
for (NSURL *imageUrl in imageURLsArray)
[formData appendPartWithFileURL:imageUrl name:[imageUrl lastPathComponent] error:nil];
error:nil];
将请求正文保存到文件,因为后台上传仅支持文件,不支持内存中的流或数据:
NSURL *fileURL = create url for a temporary file
[[AFHTTPRequestSerializer serializer]
requestWithMultipartFormRequest:request
writingStreamContentsToFile:fileURL
completionHandler:(void (^)(NSError *error))
NSMutableURLRequest *newRequest = [request mutableCopy];
newRequest.HTTPBodyStream = nil;
// Here you can start background uploading of file fileURL using newRequest request
];
如何在后台上传文件,例如这里AFNetworking 2.0 and background transfers 或这里http://www.objc.io/issue-5/multitasking.html
【讨论】:
您好 Avt,如果我创建一个包含 100 个图像的 zip 文件,那么它的大小也将与 100 个图像相同。所以,这对我来说不是一个方便的方式。 @NirmitDagly Zip 图像是一种在 ONE 请求中将 100 张图像作为单个文件发送的方法。它不会减少总尺寸的事实在这里并不重要。如您所见,我写了“将它们绑定在一个文件中,例如压缩它们”,所以这一点的主要思想是将图像绑定在一个文件中。【参考方案2】:我建议不要上传 100 张图片的单个请求,因为如果失败,整个请求都会失败。我倾向于做个人要求。单个请求可能具有直观的吸引力,因为它更简单,但在网络中断的情况下它会变得不那么优雅。
关于使用 AFNetworking 进行后台上传,请参阅 AFNetworking 2.0 and background transfers,其中介绍了一些注意事项(使用 AFHTTPSessionManager
而不是 AFHTTPRequestOperationManager
,编写必要的应用程序委托方法来捕获后台会话完成处理程序,事实上,您不能使用特定于任务的完成块处理程序等)。
注意,您需要创建上传文件的上传任务。这意味着如果您的 Web 服务需要 multipart/formdata
请求,您应该将这些请求暂存到一个文件中(请参阅 Avt 的答案),然后将其作为上传请求的文件参数提供。这不仅与后台会话兼容,而且具有最小的峰值内存使用配置文件(我认为这是您关于想要基于流的请求的评论背后的意图)。
【讨论】:
【参考方案3】:@Nirmit,您可以使用分段上传上传更多的图像。请按照链接。 https://github.com/AFNetworking/AFNetworking.
在上传一组图像时,您需要在您的端以及服务器端设置最大级别的超时限制。您还需要提供后台运行支持。万一用户进入后台模式。
在多部分请求表单中:
您需要添加图像而不是单个图像的 for 循环。在这里我添加了多部分请求表单的修改。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @@"foo": @"bar";
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
for(int i=0:i<1000:i++)
NSURL *filePath = [NSURL fileURLWithPath:arrayImages[i]];
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success: %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
【讨论】:
您不能将AFHTTPRequestOperationManager
与后台会话结合使用。同样,您不能将POST
方法与后台会话结合使用。以上是关于使用 AFNetworking 2.0 从 iOS 应用程序以流的形式上传 100 张图像的主要内容,如果未能解决你的问题,请参考以下文章
Cocoapods 集成AFNetworking从2.0版本升级到3.0版本的问题
AFNetworking 2.0 是不是支持后台任务? - IOS 7