使用S3 TransferUtility与内容Uri

3

我正在尝试使用TransferUtility上传文件到S3。 我通过ACTION_GET_CONTENT Intent获取Uri。

Intent的结果看起来像这样: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
有一个功能请求需要支持contentUri/inputStream:https://github.com/aws-amplify/aws-sdk-android/issues/1436 - Francis
1个回答

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

一个Uri不是一个文件,而TransferUtility似乎要求一个文件。因此,你可以选择:
  • 停止使用ACTION_GET_CONTENT,并集成文件选择器库,这样你就可以限制自己只使用实际的文件,或者

  • 使用ContentResolver上的UriopenInputStream(),然后使用该流将数据复制到某个你控制的文件中,然后上传该文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接