android - 将 S3 TransferUtility 与 Content Uri 结合使用

标签 android amazon-s3 awss3transferutility

我正在尝试使用 TransferUtility 将文件上传到 S3。我通过 ACTION_GET_CONTENT Intent 获取 Uri。 Intent 的结果类似于 content://com.android.externalstorage.documents/document/0000-0000:DCIM/Camera/20170811_105420_HDR.jpg

我设法使用 PutObjectRequestInputStream 通过 AmazonS3Client 上传文件,但我想使用 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) 

提前致谢

最佳答案

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

Uri 不是文件,TransferUtility 似乎需要一个文件。所以,要么:

  • 停止使用 ACTION_GET_CONTENT,而是集成 a file chooser library ,因此您可以将自己限制在实际文件中,或者

  • ContentResolver 上使用 UriopenInputStream(),然后使用该流将数据复制到一些您控制的文件,然后上传该文件。

关于android - 将 S3 TransferUtility 与 Content Uri 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49910100/

相关文章:

java - 用于 S3 服务的 java amazon SDK 中的连接被拒绝

android - AWS s3 TransferListener 未在 Android 中更新

android - 允许多人登录 Google Play 游戏服务?

java - Android Parcelable - 使用通用数据类型将数据读/写到 Parcel

python - 在ubuntu EC2深度学习实例中通过jupyter笔记本从s3读取数据

node.js - 您如何在 node.js 中验证 aws s3 身份验证版本 4 请求?

ios - 点击按钮取消 AWSS3 TransferUtility 上传任务

java - 2.2 中与布局安排相关的 Android 微调器错误

java - AudioRecord 线程中的处理