如何在 ios 中处理大文件上传?

Posted

技术标签:

【中文标题】如何在 ios 中处理大文件上传?【英文标题】:How to work with large file uploads in ios? 【发布时间】:2013-10-13 08:02:37 【问题描述】:

我的应用需要从用户手机上传视频文件,然后在服务器上进行处理。 问题是文件的大小可以达到 200 MB 以上,并且用户不会让应用程序保持打开状态等待文件上传。由于苹果不允许应用程序在后台运行超过有限的时间。如何确保我的文件已上传。我正在使用 afnetworking 来设置 ios 7 库给出的上传任务。

如果有人能指出我正确的方向或有任何解决方案,我们将不胜感激。我在这个问题上敲了太久。谢谢。

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];


    [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session,NSURLSessionTask *task ,int64_t bytesSent, int64_t totalBytesSent,int64_t totalBytesExpectedToSend)
        CGFloat progress = ((CGFloat)totalBytesSent / (CGFloat)sensize);

       NSLog(@"Uploading files %lld  -- > %lld",totalBytesSent,totalBytesExpectedToSend);
        [self.delegate showingProgress:progress forIndex:ind];
    ];



    dataTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) 
        if (error) 
            NSLog(@"Error: %@", error);
         else 

        

       ];

我的请求是一个普通的多部分表单请求。

【问题讨论】:

【参考方案1】:

用途:

NSURLSessionConfiguration:backgroundSessionConfiguration:

而不是

NSURLSessionConfiguration:defaultSessionConfiguration

来自NSURLSessionConfiguration:backgroundSessionConfiguration: documentation:

后台会话中的上传和下载任务由外部守护程序执行,而不是由应用程序本身执行。因此,即使应用暂停、退出或崩溃,传输也会在后台继续进行。

所以在你的情况下,改变:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

到:

NSString *appID = [[NSBundle mainBundle] bundleIdentifier];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID];

在您的应用委托上实现application:handleEventsForBackgroundURLSession:completionHandler: 将允许您的应用在上传完成时被唤醒(即在后台模式下未暂停或未终止)(无论是否成功完成)。

不要与后台获取混淆。你不需要它。后台获取只是简单地唤醒您的应用程序以定期让您的应用程序有机会定期获取少量内容。但是,它对于定期重新启动失败的“后台模式”上传可能很有用。

【讨论】:

@aradhya,这解决了你的问题吗?你能在后台上传大视频文件吗?【参考方案2】:

如果默认会话配置,您应该使用background session configuration。这样可以确保用户退出您的应用后,您的数据传输将在后台继续进行。

当然,只要用户在设备的“设置”应用中为您的应用启用了后台获取,这是正确的。

确保在您的项目设置中启用后台获取功能:

(来源:migueldiazrubio.com)

(来源:migueldiazrubio.com)

然后在您的 App Delegate 中实现application:handleEventsForBackgroundURLSession:completionHandler:,以便在数据传输结束时收到通知,并使用接收/发送的文件在您的应用内执行您需要执行的任何操作(UI 更新……)。 别忘了拨打completionHandler 通知系统您已结束任务。然后,iOS 将截取您应用的活动屏幕并在 iOS 7 多任务屏幕中更新该屏幕。

【讨论】:

我不确定此 API 是否需要 Background fetch

以上是关于如何在 ios 中处理大文件上传?的主要内容,如果未能解决你的问题,请参考以下文章

java 大文件分片上传处理

浏览器 大文件分片上传处理

在 ASP.NET Core 1.0 上处理大文件上传

局域网 大文件分片上传处理

iOS文件上传

iOS大文件分片上传和断点续传