Android是否支持AWS Multipart上传?

时间:2014-01-17 16:50:53

标签: android file-upload amazon-web-services amazon-s3 multipart

我正在使用亚马逊AWS S3 SDK在Android上进行视频和数据上传,而且我已经让它正常运行正常' (即,非Multipart)上传,在AsyncTask中运行,以便不占用UI。

如果我允许用​​户取消上传(无论出于何种原因),进度条会消失,但AsyncTask似乎会挂起,直到上传完成。我尝试使用常规方法杀死它,但我认为问题是由于AWS调用继续上传,即使我已经尝试杀死AsyncTask。

围绕SO和AWS论坛进行了搜索,我认为我需要取消正在进行的上传,是一个MultiPart上传,允许我在部分上传之间中止上传AsyncTask。麻烦的是,我无法在Android中找到任何如何执行此操作的示例,或AWS SDK附带的samples-bundle中的代码示例(我可以找到)。

有没有人知道一个教程,或者我可以从中获得想法的示例项目,以使Multipart上传工作?我是否需要使用TransferManager执行此操作?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

经过大量测试后,我得出结论,AWS API不允许您停止正在转移过程中的上传。

使用低级别和高级别(TransferManager)上传时可用的abortMultipartUploads()和abortMultipartUpload()方法不做他们的名字所暗示的:这些方法的作用是禁止任何其他部分从上传开始上传,但仅在某些部分已经完成上传时。它们实际上并不会在传输过程中中止上传。

提供了两种方法可以立即停止上传(shutdown()和shutdownNow()),但这些方法似乎对正在进行的传输一旦启动就没有任何影响。< / p>

如果您使用低级分段上传方法,则可以暂停和恢复上传,但没有实际的方法可以阻止它。暂停仅在最后一个部分完成传输时停止上传序列,但此传输最少为5Mb,因此如果您使用的是慢速数据连接,则此5Mb可能需要一段时间才能实际暂停。

我怀疑AWS提供的API主要是为企业用户的专业服务器应用程序而设计的,并且仅为移动应用程序使用提供口头服务。 AWS可能是一个故意的步骤,不允许转移停止。

无论如何,我发现只有一种方法可以在转移开始后停止转移。我希望有些人会对使用这种方法提出抗议,但在AWS为Android提供更好的API之前,我坚持使用它:

我正在使用TransferManager(Android示例here)开始上传,然后使用线程跟踪进度,以通过处理程序更新进度条。

在决定取消时,我关闭所有正在运行的线程和进度条。 TransferManager对所有这一切都不了解,并继续传输它自己的线程,你不能直接停止,所以下一步是调用:

finish();

接下来是:

System.exit(0);

或:

Process.killProcess(Process.myPid());

这会导致Android转储回调用的Activity,并强制清理当前正在使用的所有资源。至关重要的是,它会锁定TransferManager使用的资源,从而导致传输立即停止。如果您认为上传的任何部分已经完成,您可能仍需要在同一个存储桶上调用abortMultipartUploads()或abortMultipartUpload(),以便让AWS清理部分上传,否则您可能仍在为上传付费一部分。

它并不漂亮,我更喜欢使用正确的关机方法,但在AWS提供方法之前,这是我发现完全停止正在进行的传输的唯一方法。

希望这可以帮助有人遇到同样的问题。