iPhone:将大型文件从手机上传到服务器的策略

时间:2011-04-08 20:21:59

标签: iphone objective-c file-upload

我们遇到了将图像从iPhone上传到后端(云端)服务的问题。该调用是一个简单的HTTP文件上传,问题似乎是在上传完成之前断开连接 - 在服务器端我们得到IOError:客户端读取错误(超时?)。

偶尔会发生这种情况:大部分时间都有效,有时会失败。当存在良好的连接(即wifi)时,它始终有效。

我们在客户端库上调整了各种超时参数,以确保我们没有点击任何超时参数。这个问题实际上似乎是不可靠的移动连接。

即使遇到连接不良,我也在考虑使上传可靠的策略。

首先想到的是将文件分成较小的块并将其转换成碎片,增加每件碎片到达那里的可能性。但这在客户端和服务器端都引入了相当大的复杂性。

你有一个聪明的方法吗?你会如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我会使用ASIHTTPRequest库。它有一些很棒的功能,如带宽限制。它可以直接从系统上传文件,而不是先将文件加载到内存中。我也会将照片分成10个部分。因此,对于5兆的照片,它将是每个500k。您只需创建每个上传using a queue。然后,当应用程序进入后台时,它可以完成当前正在上传的部分。如果您无法在分配的时间内完成上传所有部分,只需发布​​本地通知,提醒用户未完成。然后在将所有部件发送到您的服务器之后,您将调用最终请求,将所有部件组合回服务器端的照片中。

答案 1 :(得分:0)

是的,一般来说,超时很棘手,在处理移动连接时会变得更复杂。

以下是一些想法:

  1. 尝试按原样上传到您的云服务。在几次失败(超时)之后,标记文件,并要求用户将他们的手机连接到wifi网络,或者等到他们连接到计算机并通过网络手动上传。然而,这并不理想,因为它会向用户推送更多工作。好处是实施方面,它非常直接。

  2. 而不是进行HTTP上传,而是执行原始套接字发送。使用原始套接字,您可以非常轻松地以块的形式发送二进制数据,如果任何块发送超时,则重新发送它直到发送整个图像文件。这是“更复杂”,因为你必须管理二进制套接字传输,但我认为这比通过HTTP上传尝试块文件更容易。

  3. 无论如何,这就是我接近它的方式。