LoginSignup
5
3

More than 5 years have passed since last update.

【AWS・S3】 結局、複数ファイルのアップロードはどうやるの?

Last updated at Posted at 2018-03-13

【発端】
自作Androidアプリで作成したファイル(一度に複数生成される。)を
サーバーで管理して、別端末で受け取る必要が出てきたので、
MobileHubからのS3で取り急ぎ実装。

【つまづき】
・s3Clientを指定して!
 というエラーが出る。
・AWS S3 Access Denied
 というエラーが出る。
・同期処理のなかでサーバーとやり取りしないで!
 というエラーが出る。
・複数ファイルのアップロードをどうしたら実装できるのか
 チュートリアルには書かれていない。
・一旦実装したものの、s3Clientを呼び出す所で度々エラーが起きる

似たような悩みを持っていた人たち。
AWS S3 Java SDK - Access Denied
Amazon s3 upload multiple files android

【解決】

class AsyncAWS_upload extends AsyncTask<String, Void, String> {

    Activity BaseActivity;

    AsyncAWS_upload(Activity activity) {
        this.BaseActivity = activity;
    }

    @Override
    protected String doInBackground(String... strings) {
        uploadData();
        return null;
    }

    public void uploadData() {

       TransferUtility transferUtility =
                TransferUtility.builder()
                        .context(getApplicationContext())
                        .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
                        .s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider()))
                        .build();


        TransferObserver uploadObserver =
                transferUtility.upload(
                        "protected/hoge.file",
                        new File(Environment.getExternalStorageDirectory() + "/hoge.file"));

               transferUtility.upload(
                        "hogehoge_test/hoge.csv",
                        new File(Environment.getExternalStorageDirectory() + "/hoge.csv"));

        uploadObserver.setTransferListener(new TransferListener() {
            @Override
            public void onStateChanged(int id, TransferState state) {
                if (TransferState.COMPLETED == state) {
                    LOGD("XXXTransferStateonStateChanged", "FINISH");
                    // Handle a completed upload.
                }
            }

            @Override
            public void onProgressChanged(
                    int id, long bytesCurrent, long bytesTotal) {
                LOGD("XXXTransferStateonProgressChanged", "HERE");
                // TODO Auto-generated method stub
            }

            @Override
            public void onError(int id, Exception ex) {
                // TODO Auto-generated method stub
                LOGD("XXXTransferStateonError", String.valueOf(ex));
            }

        });

        // If your upload does not trigger the onStateChanged method inside your
        // TransferListener, you can directly check the transfer state as shown here.
        if (TransferState.COMPLETED == uploadObserver.getState()) {
        }
    }
}

・s3Clientを指定してあげる。(コードは公式のものを使用)
・buold.gradeleには
compile ('com.amazonaws:aws-android-sdk-mobile-client:2.6.+@aar') { transitive = true; }
と正しく記載しないと、com.amazonaws.mobile.client.AWSMobileClient
が読み込まれません。
・バゲットへのアクセス権限をホスト側で設定変更。
・非同期処理のためのサブクラスをつくり、メインクラスから実行させる。
・transferUtilityに複数のアップロード情報を持たせる。

で動くように。
細かい部分の理解は飛ばしてしまっているので、ドキュメントを確認次第補足します。
英文ドキュメントありがとう。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3