如果有人还在寻找解决方案,我最终使用了一个循环的代码,我没有找到一个官方的api来做多个文件上传。
我有一个ImageFiles的ArrayList,我想上传到亚马逊s3。他们的文档提供了这样的代码:
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()));但是这段代码只需要一个文件。如何一次上传多个文件?如果他们不允许这样做,以便用户可以发出更多请求,那么还有什么替代方法呢?
发布于 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) } }) }}
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为了这个。
发布于 2018-10-22 20:27:36
您可以为此任务创建可观察性
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
public class AWSFile {
private int id;
private TransferState newState;
private String filename;
}发布于 2017-10-11 02:35:58
您可以将上传的代码移到一个方法中,并将文件路径传递给它。然后,您可以在文件路径列表中循环该方法。至少我是这么做的。如果你需要进一步的帮助,请告诉我。
https://stackoverflow.com/questions/46059515
复制相似问题