使用 rxJava 将多个图像上传到 AWS 服务器

Uploading multiple image to AWS server using rxJava

我正在尝试使用 rxJava 将多张图片上传到 ASW。我找到了一个科特林例子。

Upload multiple images(nearly 100) from Android to Amazon S3?.

我尝试使用 Java 来实现它。但找不到任何合适的方法。有人可以帮我吗?

public void processImageFiles(){
        uploadedImageInfo = new ArrayList<>();

        List<Single<Boolean>> uploadList = new ArrayList<>();

         for(File file : selectedImageList){
            String fileExtension = MimeTypeMap.getFileExtensionFromUrl(file.toString());
            String fileName = Calendar.getInstance().getTimeInMillis() + sharedPref.getSharedPrefData(SharedPref.USER_ID) + "." + fileExtension;
            String uploadedFileLink = "https://" + ApiClient.BUCKET_NAME + "." + ApiClient.AWS_END_POINT + "/" + fileName;
            RecordData recordData =  new RecordData();
            recordData.setUrl(uploadedFileLink);
            recordData.setFileType(fileExtension);
            recordData.setFileName(fileName);
            uploadedImageInfo.add(recordData);
            uploadList.add(uploadToAWS(file, recordData));
        }
         

    }


    public Single<Boolean> uploadToAWS(File imageFile, RecordData data) {

        return Single.create(emitter -> {

            AmazonS3 s3Client = new AmazonS3Client(new BasicAWSCredentials(ApiClient.ACCESS_KEY, ApiClient.SECRET_KEY));
            String uploadLink = ApiClient.BUCKET_NAME;
            s3Client.setEndpoint(ApiClient.AWS_END_POINT);
            s3Client.setRegion(Region.getRegion(Regions.US_EAST_1));
            TransferUtility transferUtility = new TransferUtility(s3Client, mContext);
            TransferObserver transferObserver = transferUtility.upload(uploadLink, data.getFileName(), imageFile, CannedAccessControlList.PublicRead);
            mContext.registerReceiver(TransferNetworkLossHandler.getInstance(mContext), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

            transferObserver.setTransferListener(new TransferListener() {

                @Override
                public void onStateChanged(int id, TransferState state) {

                    Log.e("onStateChanged", state.name() + "");
                    if (state.name().equals(TransferState.COMPLETED.name())) {
                        emitter.onSuccess(true);
                    } else {
                        emitter.onError(null);
                    }

                }

                @Override

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

                    //Implement the code to handle the file uploaded progress.
                    Log.e("e", bytesCurrent + "");

                }

                @Override

                public void onError(int id, Exception exception) {
                    emitter.onError(exception);

                }

            });
        });
    }

我已经回复了 运行 多个并行请求的类似问题。你可以找到它们 here

我可以建议你这个实现:

public final class RecordData {
    private final String url;
    private final String fileType;
    private final String fileName;

    public RecordData(String url, String fileType, String fileName) {
        this.url = url;
        this.fileType = fileType;
        this.fileName = fileName;
    }

    public String getUrl() {
        return url;
    }

    public String getFileType() {
        return fileType;
    }

    public String getFileName() {
        return fileName;
    }
}

public RecordData toRecord(File file) {
    String fileExtension = MimeTypeMap.getFileExtensionFromUrl(file.toString());
    String fileName = Calendar.getInstance().getTimeInMillis() + sharedPref.getSharedPrefData(SharedPref.USER_ID) + "." + fileExtension;
    String uploadedFileLink = "https://" + ApiClient.BUCKET_NAME + "." + ApiClient.AWS_END_POINT + "/" + fileName;
    return new RecordData(uploadedFileLink, fileExtension, fileName);
}

public void processImageFiles(List<File> selectedImageList) {
    Observable.fromIterable(selectedImageList)
            .flatMapSingle(file -> uploadToAWS(file, toRecord(file)).subscribeOn(Schedulers.io()))
            .subscribe();
}