使用 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 张图像的主要内容,如果未能解决你的问题,请参考以下文章

连接 JSON AFnetworking 2.0

Cocoapods 集成AFNetworking从2.0版本升级到3.0版本的问题

AFNetworking 2.0 是不是支持后台任务? - IOS 7

PHP REST 服务中的 JSON 格式问题从 AFNetworking 2.0 接收 POST

通过 AFNetworking 2.0 上传 iOS 图像

如何在 iOS 中使用 AFNetworking 从 REST 接口定期轮询/拉取