2011-04-08 21 views
1

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

偶尔会出现这种情况:大部分时间都有效,有时会失败。当一个良好的连接(即无线),它总是工作。

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

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

首先想到的是将文件分割成更小的块并将其分块传输,从而增加了每个块到达那里的可能性。但是这在客户端和服务器端引入了相当复杂的一点。

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

+0

我们说多少? 5 megs? 20 megs? – 2011-04-09 04:35:03

+0

这是一个500万像素的相机,图片往往在1-3兆之间。 – Parand 2011-04-10 18:13:15

回答

0

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

这里有几个想法:

  1. 尝试上传到您的云服务,你在做什么。在几次失败(超时)后,标记文件,并要求用户将手机连接到WiFi网络,或等待他们连接到计算机,并通过网络手动上传。但这并不理想,因为它会将更多工作推向用户。实施方面的好处是,它非常简单。

  2. 而不是做HTTP上传,而是做一个原始套接字发送。使用原始套接字,您可以非常容易地发送二进制数据块,并且如果有任何块发送超时,请重新发送,直到发送完整的图像文件。这是“更复杂”,因为您必须管理二进制套接字传输,但我认为这比通过HTTP上传来分块文件更容易。

无论如何,这就是我将如何接近它。

+0

谢谢艾伦。我们已经做了1,但如果可能的话,我想让非WiFi可靠。对于2,如果我们使用原始套接字路由,则必须在http之外完成服务器部分,这会引入各种有趣的折痕 - 穿过防火墙,反向代理等。至少使用http分块,我们可以使用大多数的现有基础设施。 – Parand 2011-04-08 20:33:37

1

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

+1

+1为ASIHTTPRequest - 伟大的图书馆。 – Moshe 2011-04-11 03:21:49

+0

我们正在使用ASIHTTPRequest。看起来核心问题可能与AT&T的网络有关,我们现在正在测试解决方法(请参阅http://groups.google.com/group/asihttprequest/browse_thread/thread/c5805a53a04eb2e8) – Parand 2011-04-19 18:58:20