簡體   English   中英

Amazon S3 AWS上傳進度監聽器

[英]Amazon S3 AWS upload progress listener

有誰知道如何在Amazon S3的分段上傳中查看上傳進度(百分比)?

我會這樣做:

MultipleFileUpload transfer = transferManager.uploadDirectory(mybucket, null, new File(localSourceDataFilesPath), false);

// blocks the thread until the upload is completed
showTransferProgress(transfer);

然后在showTransferProgress中 ,我將使用睡眠創建一個塊上傳,並每隔X秒進行一次數學運算:

private void showTransferProgress(MultipleFileUpload xfer) {
        while (!xfer.isDone()) {
            // some logic to wait so you don't do the math every second like a Thread.sleep

            TransferProgress progress = xfer.getProgress();
            long bytesTransferred = progress.getBytesTransferred();
            long total = progress.getTotalBytesToTransfer();
            Double percentDone = progress.getPercentTransferred();
            LOG.debug("S3 xml upload progress...{}%", percentDone.intValue());
            LOG.debug("{} bytes transferred to S3 out of {}", bytesTransferred, total);
        }

        // print the final state of the transfer.
        TransferState xferState = xfer.getState();
        LOG.debug("Final transfer state: " + xferState);
    }

這行是您要尋找的:

Double percentDone = progress.getPercentTransferred();

這可行,但可能是一種更好的方法

TransferManager tm = TransferManagerBuilder
                .standard()
                .withS3Client(s3Client)
                .build();

        PutObjectRequest request = new PutObjectRequest(bucketName, file.getName(), file);

        ProgressListener progressListener = new ProgressListener() {
            @Override
            public void progressChanged(com.amazonaws.event.ProgressEvent progressEvent) {
                bytesUploaded += progressEvent.getBytesTransferred();// add counter
                if (bytesUploaded > byteTrigger) {
                    if ((bytesUploaded + sizeRatio) < fileSize) {
                        byteTrigger = bytesUploaded + sizeRatio ;
                    } else {
                        byteTrigger = bytesUploaded + (sizeRatio / 6);// increase precision approaching the end
                    }
                    String percent = new DecimalFormat("###.##").format(bytesUploaded * 100.0 / fileSize);
                    log.info("Uploaded: " + FileUtils.byteCountToDisplaySize(bytesUploaded) + " - " + percent + "%");
                }
            }
        };

        request.setGeneralProgressListener(progressListener);
        Upload upload = tm.upload(request);

        log.info("starting upload");

        upload.waitForUploadResult();

        log.info("Upload completed");

大家好,這是我的最終版本

private void awsHoldUntilCompletedAndShowTransferProgress(Upload upload) throws InterruptedException, AmazonClientException {
        TransferProgress tProgress = upload.getProgress();
        long totalSize = tProgress.getTotalBytesToTransfer();
        long bPrevious = 0;
        int timerSec = Math.toIntExact(Math.round(Math.sqrt(totalSize / 1024 / 1024) / 4));// calculate based on file size
        if (timerSec > 60) {// no longer than 60 second per loop
            timerSec = 60;
        }
        while (!upload.isDone()) {
            long bTransferred = tProgress.getBytesTransferred();
            String strMbps = Double.valueOf((((bTransferred - bPrevious) / timerSec) / 1024) / 1024).toString() + " MBps";
            String strTransfered = bTransferred + " bytes";
            if (bTransferred > 1024) {
                strTransfered = Double.valueOf((bTransferred / 1024) / 1024).toString() + " MB";
            }
            log.info("Upload progress: "
                    + strTransfered
                    + " / "
                    + FileUtils.byteCountToDisplaySize(totalSize) + " - "
                    + Math.round(tProgress.getPercentTransferred()) + "% "
                    + strMbps);

            bPrevious = bTransferred;
            TimeUnit.SECONDS.sleep(timerSec);
        }

        Transfer.TransferState transferState = upload.getState();
        log.info("Final transfer state: " + transferState);

        if (transferState == Transfer.TransferState.Failed) {
            throw upload.waitForException();
        }
}

這是我從上面調用上面的代碼的地方

..stuff...

TransferManager tm = TransferManagerBuilder
                        .standard()
                        .withS3Client(s3Client)                    
                        .build();

LocalDateTime uploadStartedAt = LocalDateTime.now();
log.info("Starting to upload " + FileUtils.byteCountToDisplaySize(fileSize));

Upload up = tm.upload(bucketName, file.getName(), file);

awsHoldUntilCompletedAndShowTransferProgress(up);

log.info("Time consumed: " + DurationFormatUtils.formatDuration(Duration.between(uploadStartedAt, LocalDateTime.now()).toMillis(), "dd HH:mm:ss"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM