【问题标题】:AWS S3 uploads stuck in WAITING stateAWS S3 上传卡在 WAITING 状态
【发布时间】:2018-12-21 23:54:44
【问题描述】:

我已经查看了几个关于此的问题和答案,但我仍然无法上传到 S3 存储桶。我已经在应用程序标签内的清单中声明了该服务。

每个日志语句都返回正确的信息,但状态始终为 WAITING,并且没有触发任何传输侦听器。我没有收到任何错误,并且 S3 存储桶仍然是空的。

我做错了什么?

public void uploadStoredItems() {

    TransferUtility transferUtility = TransferUtility.builder()
            .context(AWSProvider.getInstance().getContext())
            .awsConfiguration(AWSProvider.getInstance().getConfiguration())
            .s3Client(new AmazonS3Client(AWSProvider.getInstance().getIdentityManager().getCredentialsProvider()))
            .build();

    try {
        for (File csvFile : csvFiles) {
            String filename = csvFile.getName(); //.substring(csvFile.getName().lastIndexOf('/') + 1);
            Log.d(TAG, "This is the filename for upload: " + filename);

            // FileReader reads text files in the default encoding.
            String line = null;
            FileReader fileReader = new FileReader(csvFile);

            // Always wrap FileReader in BufferedReader.
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            while ((line = bufferedReader.readLine()) != null) {
                Log.d(TAG, "Here are the lines: " + line);
            }

            // Always close files.
            bufferedReader.close();

            TransferObserver uploadObserver = transferUtility.upload(filename, csvFile);
            // Gets id of the transfer.
            Log.d(TAG, "This is the bucket: " + uploadObserver.getBucket());
            Log.d(TAG, "This is the state: " + uploadObserver.getState());
            Log.d(TAG, "This is the id: " + uploadObserver.getId());

            observers = transferUtility.getTransfersWithType(TransferType.UPLOAD);
            TransferListener listener = new TransferListener() {
                @Override
                public void onStateChanged(int id, TransferState state) {
                    Log.d(TAG, "onStateChanged: " + state.toString());
                    if (TransferState.COMPLETED == state) {
                        Log.d(TAG, "COMPLETE: " + state.toString());
                    }
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                    float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100;
                    int percentDone = (int) percentDonef;

                    Log.d(TAG, "ID:" + id + " bytesCurrent: " + bytesCurrent
                            + " bytesTotal: " + bytesTotal + " " + percentDone + "%");
                }

                @Override
                public void onError(int id, Exception ex) {
                    // Handle errors
                    Log.d(TAG, "ERROR ID:" + id + " " + ex.getMessage());
                }
            };

            for (TransferObserver observer : observers) {

                if (TransferState.WAITING.equals(observer.getState())
                        || TransferState.WAITING_FOR_NETWORK.equals(observer.getState())
                        || TransferState.IN_PROGRESS.equals(observer.getState())) {
                    observer.setTransferListener(listener);
                }

                Log.d(TAG, "\n observers - id: " + observer.getId() + " state: " + observer.getState() + " key: " + observer.getKey() + " bytes total: " + observer.getBytesTotal());
            }
            Log.d(TAG, "Bytes Total: " + uploadObserver.getBytesTotal());

        }
        csvFiles.clear();
    } catch(java.io.FileNotFoundException ex) {
        System.out.println("Unable to open file");
    } catch(java.io.IOException ex) {
        System.out.println("Error reading file");
    }
} 

【问题讨论】:

  • 您可以尝试删除observers = transferUtility.getTransfersWithType(TransferType.UPLOAD); 并将侦听器仅附加到uplaodObserver 吗? uploadObserver.setTransferListener(listener)。上传操作和 getTransfersWithType 完成的查询操作之间的数据库中似乎存在同步问题?让我知道这是怎么回事。

标签: java android amazon-web-services amazon-s3 upload


【解决方案1】:

事实证明,我必须声明 TransferUtility 服务在我从中调用它的服务正在运行的同一进程中运行:

<application

    ...

    <service
      android:name=".MainService"
      android:enabled="true"
      android:process=":main_service"
      android:stopWithTask="false" />
    <service
      android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
      android:process=":main_service"
      android:enabled="true" />

    ...

</application>

【讨论】:

  • 感谢您的回答!仅当您从服务上下文调用传输实用程序时才需要此更改吗?
  • 好像是这样,虽然我没有在任何地方正式阅读过。我刚刚找到了一个通过做同样的事情来解决问题的例子:stackoverflow.com/a/44989769/5927903
  • 我是从主线程上的另一个类做的,它卡在 WAITING 中。你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2019-09-09
  • 2018-08-27
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多