将文件从 Android 缓慢上传到 Amazon S3

Posted

技术标签:

【中文标题】将文件从 Android 缓慢上传到 Amazon S3【英文标题】:Upload file to Amazon S3 from Android slow 【发布时间】:2015-09-21 01:14:41 【问题描述】:

我已按照 Amazon 指南将文件上传到 Amazon S3,但我注意到它太慢了。上传一个 20kb 左右的简单 png 文件大约需要 10 秒。

最初我以为问题与线程有关,我已经实现了一个 AsyncTask 来上传图像,但问题仍然存在。以下是用于上传图像的代码。

private class UploadFileTask extends AsyncTask<String, Integer, String> 
    String remotePath;
    String remoteFileName;
    File file;
    Context context;
    S3UploadInterface listener;


    public UploadFileTask(Context context,String remotePath,String remoteFileName, File file, S3UploadInterface listener)
        this.context=context;
        this.remotePath=remotePath;
        this.remoteFileName=remoteFileName;
        this.file=file;
        this.listener=listener;
    

    protected String doInBackground(String... params) 
        credentialsProvider = new CognitoCachingCredentialsProvider(context,
                "MY_PRIVATE_CREDENTIAL",
                Regions.US_EAST_1);
        TransferManager transferManager = new TransferManager(credentialsProvider);
        Upload upload = transferManager.upload(remotePath, remoteFileName, file);
        TransferProgress transferred = upload.getProgress();
        while (!upload.isDone()) 
            try 
                publishProgress((int) transferred.getPercentTransferred());
             catch (Exception e) 
                listener.uploadFailed(e);
            
        
        return "uploaded";
    

    protected void onProgressUpdate(Integer... progress) 
        if (listener!=null)
            listener.currentUploadProgress(progress[0]);
    

    protected void onPostExecute(String result) 
        if (listener!=null)
            listener.uploadCompleted();
    

有解决这个问题的办法吗? 谢谢:)

【问题讨论】:

你如何测量时间?上传速度可能因网络质量而异。它还受您连接到哪个端点的影响。例如,如果您在欧洲并且您将文件上传到 us-east-1(美国弗吉尼亚州),它可能会很慢。选择离您最近的端点可能会提高速度。 目前我们在欧洲,我们在弗吉尼亚有我们的实例。也许问题是由于区域变化,因为发布的代码是直截了当的。在我们未来的计划中,我们会将我们的实例迁移到爱尔兰,我们将检查问题是否仍然存在。我会持续更新的 您看过 Amazon Route 53 (aws.amazon.com/route53) 吗?它是一种基于 DNS 的产品,可让您根据位置路由到最近的可用 S3 或 AWS 资源。 是的,在我们计划的架构中,我们希望实施 de Route 53 以提供更大的灵活性。 【参考方案1】:

这会影响你的 CPU

    while (!upload.isDone()) 
        try 
            publishProgress((int) transferred.getPercentTransferred());
         catch (Exception e) 
            listener.uploadFailed(e);
        
    

尝试添加 Thread.sleep 让其他线程有时间运行。

【讨论】:

好点!我按照亚马逊 S3 文档实现了 while 循环,我将尝试使用您的解决方案并检查它是如何工作的。谢谢! @frank 是真的,甚至亚马逊也证实了这一点,请在下面的“如何使用 TransferManager”部分查看。 mobile.awsblog.com/post/Tx1V588RKX5XPQB/… 上传可能比进度条显示的早得多,因为系统正忙于处理处理程序队列中的大量消息。

以上是关于将文件从 Android 缓慢上传到 Amazon S3的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 Android 上传到 Amazon S3?

Android Amazon S3文件上传不起作用

如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)

使用 NodeJS 将文件上传到 Amazon S3

从 Apache Spark 分段上传到 Amazon S3

如何使用 node.js、Express 和 knox 将文件从浏览器上传到 Amazon S3? [关闭]