首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >亚马逊s3上传多个安卓文件

亚马逊s3上传多个安卓文件
EN

Stack Overflow用户
提问于 2017-09-06 00:23:57
回答 4查看 4.7K关注 0票数 4

如果有人还在寻找解决方案,我最终使用了一个循环的代码,我没有找到一个官方的api来做多个文件上传。

我有一个ImageFiles的ArrayList,我想上传到亚马逊s3。他们的文档提供了这样的代码:

代码语言:javascript
复制
credentials = new BasicAWSCredentials(key, secret);
s3 = new AmazonS3Client(credentials);               
transferUtility = new TransferUtility(s3, getContext());
observer.setTransferListener(new TransferListener() {
    @Override
    public void onStateChanged(int id, TransferState state) {

    }

    @Override
    public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
    }

    @Override
    public void onError(int id, Exception ex) {

    }
});
observer = transferUtility.upload("buket name", upload_file.getNew_name(),
                                   new File(upload_file.getFile_path()));

但是这段代码只需要一个文件。如何一次上传多个文件?如果他们不允许这样做,以便用户可以发出更多请求,那么还有什么替代方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-27 21:19:58

我知道我回答晚了,但这会帮助其他来这里寻找答案的人。

目前,上传多个文件的唯一选择是使用循环将列表中的文件作为单个文件进行传递,但这是我昨晚找到并实现的。到目前为止,我已经测试过很多次了。

这种方法的优点是它对每个文件并行运行,而不是等待每个文件首先上载或下载后才对下一个文件进行操作。

这就是我发现的here但为了在Kotlin中使用,我对它做了一些修改。

  • 首先,创建一个类,我已经将其命名为MultiUploaderS3-

导入返回导入com.amazonaws.mobileconnectors.s3.transferutility.TransferListener导入com.amazonaws.mobileconnectors.s3.transferutility.TransferState导入com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility导入io.reactivex.Completable导入io.reactivex.Observable导入io.reactivex.Single导入java.io.File类MultiUploaderS3 { TransferUtility(s3ClientInitialization(context),fun transferUtility(上下文:上下文):Single?{ return Single.create { emitter -> emitter.onSuccessObservable.fromIterable(fileToKeyUploads.entries) }} fun uploadMultiple(fileToKeyUploads: Map,context: Context):可完成?{ return transferUtility( context) !!.flatMapCompletable { transferUtility -> .flatMapCompletable { entry -> uploadSingle( transferUtility,entry.key,entry.value )}私人娱乐文件( transferUtility: TransferUtility,aLocalFile: uploadSingle?,toRemoteKey: String?):可完成?{ return Completable.create { emitter -> transferUtility.upload(bucketName,toRemoteKey,aLocalFile) .setTransferListener(object : TransferListener { override fun onStateChanged( id: Int,状态: TransferState ){ if (TransferState.FAILED ==状态){emitter.onError(异常(“传输状态失败”))} else if (TransferState.COMPLETED ==状态){emitter.onComplete() }}覆盖fun onProgressChanged( id: Int,bytesCurrent: Long,bytesTotal: Long ){}重写fun onError(id: Int,exception: Exception) { emitter.onError(exception) } }) }}

  • 我创建了一个返回S3Client的函数,如下所示-

fun s3ClientInitialization(context: Context):AmazonS3 { val cognitoCachingCredentialsProvider = CognitoCachingCredentialsProvider( context,your key,region ) return AmazonS3Client( cognitoCachingCredentialsProvider,Region.getRegion(Regions.YOUR_地域))}

  • 那就叫它-

val map: Map = yourArrayList.map {将其添加到您的_密钥_对于_每个_File}.toMap() MultiUploaderS3().uploadMultiple(map,this) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .subscribe { runOnUiThread { Toast(this@AddActivity,“上传完成”,Toast.LENGTH_LONG).show() }}

我已经分享了完整的工作代码,您可以根据需要进行更改。你可以使用上面的MultiUploaderS3类中的类,这显然会使访问TransferListener

对于下载,请更改

transferUtility.upload(bucketName,toRemoteKey, aLocalFile)uploadSingle()transferUtility.download(bucketName, fromRemoteKey, aLocalFile)

并将其称为

val map: Map = yourKeysArrayList.map {Your_FILE_For_Each_KEY to it}.toMap()

这样做的目的是将本地文件路径的映射传递给Keys。

我曾多次尝试在一次运行中上传10个文件,上传所有文件需要大约4-5秒,但这也取决于您的互联网连接。我希望下载部分也能正常工作。问我是不是有什么事或者查看我的Github为了这个。

票数 4
EN

Stack Overflow用户

发布于 2018-10-22 20:27:36

您可以为此任务创建可观察性

代码语言:javascript
复制
public Observable upload(List paths) {
        List> list = new ArrayList<>();
        for (String path: paths) {
            list.add(upload(path));
        }
        return Observable.concat(list);
    }

public Observable upload(String filePath) {
        if (filePath == null) {
            Log.d(TAG, "uploadWithTransferUtility: ");
            return Observable.never();
        }
        return Observable.create(emitter -> {
            File file = new File(filePath);
            TransferObserver observer = awsUtil.getTransferUtility(context).upload(awsUtil.getAwsConstants().BUCKET_NAME, file);
            observer.setTransferListener(new TransferListener() {
                @Override
                public void onStateChanged(int id, TransferState state) {
                    stateChanged(id, state);
                    emitter.onNext(new AWSFile(id,state,file.getName()));
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                    progressChanged(id, bytesCurrent, bytesTotal);
                }

                @Override
                public void onError(int id, Exception ex) {
                    error(id,ex);
                    emitter.onError(ex);
                }
            });
            emitter.setCancellable(observer::cleanTransferListener);
        });
}

这只是一个代码片段,你可以使用它来创建多个文件,也可以只使用一个文件。

编辑: AWSFile.java

代码语言:javascript
复制
public class AWSFile {
    private int id;
    private TransferState newState;
    private String filename;
}
票数 1
EN

Stack Overflow用户

发布于 2017-10-11 02:35:58

您可以将上传的代码移到一个方法中,并将文件路径传递给它。然后,您可以在文件路径列表中循环该方法。至少我是这么做的。如果你需要进一步的帮助,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46059515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档