将S3 TransferUtility与Content Uri一起使用

时间:2018-04-18 22:43:07

标签: android amazon-s3 awss3transferutility

我尝试使用TransferUtility将文件上传到S3。我通过ACTION_GET_CONTENT意图得到了Uri。 意图的结果看起来像content://com.android.externalstorage.documents/document/0000-0000:DCIM/Camera/20170811_105420_HDR.jpg

我设法使用AmazonS3ClientPutObjectRequest通过InputStream上传文件,但为了方便起见,我想使用TransferUtilityTransferObserver暂停上传的能力。

我的代码:

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

File f = new File(_uri.getPath());
TransferObserver tO = tU.upload("test.jpg", f);

崩溃:

Caused by: java.lang.IllegalArgumentException: Invalid file: /document/0000-0000:DCIM/Camera/20170811_105420_HDR.jpg
                  at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:532)
                  at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:497)
                  at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:466)
                  at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:420)
                  at my.domain.myapp.aws.AwsConnector.uploadFile(AwsConnector.java:76)
                  at my.domain.myapp.MainActivity.onActivityResult(MainActivity.kt:26)
                  at android.app.Activity.dispatchActivityResult(Activity.java)
                  at android.app.ActivityThread.deliverResults(ActivityThread.java) 
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java) 
                  at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
                  at android.os.Handler.dispatchMessage(Handler.java) 
                  at android.os.Looper.loop(Looper.java) 
                  at android.app.ActivityThread.main(ActivityThread.java) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 

提前致谢

1 个答案:

答案 0 :(得分:2)

File f = new File(_uri.getPath());

Uri不是文件,而TransferUtility似乎要求提供文件。所以,要么:

  • 停止使用ACTION_GET_CONTENT,而是集成a file chooser library,这样您就可以将自己限制为实际文件,或者

  • 使用Uri上的openInputStream()ContentResolver,然后使用该流将数据副本复制到您控制的某个文件中,然后上传该文件。< / p>