Загрузить файл или InputStream на S3 с обратным вызовом прогресса - PullRequest
3 голосов
/ 18 сентября 2010

Мы загружаем файл с помощью библиотеки Amazon AWS Java и испытываем затруднения с получением прогресса загрузки. В настоящее время мы звоним по следующему номеру:

File file = new File(localAsset.getVideoFilePath());
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, localAsset.getFileName(), file);
s3.putObject(putObjectRequest);

Как установить обратный вызов для проверки хода загрузки файла?

Спасибо

Ответы [ 3 ]

5 голосов
/ 18 сентября 2010

Я натолкнулся на эту проблему и написал простую оболочку InputStream, которая печатает хорошие индикаторы выполнения:

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.vfs.FileContent;
import org.apache.commons.vfs.FileSystemException;

public class ProgressInputStream extends InputStream {
    private final long size;
    private long progress, lastUpdate = 0;
    private final InputStream inputStream;
    private final String name;
    private boolean closed = false;

    public ProgressInputStream(String name, InputStream inputStream, long size) {
        this.size = size;
        this.inputStream = inputStream;
        this.name = name;
    }

    public ProgressInputStream(String name, FileContent content)
    throws FileSystemException {
        this.size = content.getSize();
        this.name = name;
        this.inputStream = content.getInputStream();
    }

    @Override
    public void close() throws IOException {
        super.close();
        if (closed) throw new IOException("already closed");
        closed = true;
    }

    @Override
    public int read() throws IOException {
        int count = inputStream.read();
        if (count > 0)
            progress += count;
        lastUpdate = maybeUpdateDisplay(name, progress, lastUpdate, size);
        return count;
    }
    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        int count = inputStream.read(b, off, len);
        if (count > 0)
            progress += count;
        lastUpdate = maybeUpdateDisplay(name, progress, lastUpdate, size);
        return count;
    }

    static long maybeUpdateDisplay(String name, long progress, long lastUpdate, long size) {
        if (Config.isInUnitTests()) return lastUpdate;
        if (size < B_IN_MB/10) return lastUpdate;
        if (progress - lastUpdate > 1024 * 10) {
            lastUpdate = progress;
            int hashes = (int) (((double)progress / (double)size) * 40);
            if (hashes > 40) hashes = 40;
            String bar = StringUtils.repeat("#",
                    hashes);
            bar = StringUtils.rightPad(bar, 40);
            System.out.format("%s [%s] %.2fMB/%.2fMB\r",
                    name, bar, progress / B_IN_MB, size / B_IN_MB);
            System.out.flush();
        }
        return lastUpdate;
    }
}

(это копирование и вставка из действующего кода, поэтому вам, возможно, придется сделать несколько исправлений, чтобы заставить его работать в вашем собственном коде.)

Затем, просто используйте способ ввода InputStream (убедитесь, что вы указали размер!), И он станет хорошим индикатором прогресса для вас. Если вам нужен правильный обратный вызов, это тоже будет довольно легко сделать.

0 голосов
/ 15 мая 2017

Использование обработчика прогресса для отслеживания прогресса

File file = new File(localAsset.getVideoFilePath());
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, localAsset.getFileName(), file);

putObjectRequest.setGeneralProgressListener(new ProgressListener() {
      long transferred = 0;

      @Override
      public void progressChanged(ProgressEvent progressEvent) {
            transferred += progressEvent.getBytesTransferred();
            Timber.i("Transferred %f%%", code, ((float)transferred / (float) fileSize) * 100f);
        }
    });

s3.putObject(putObjectRequest);
0 голосов
/ 18 сентября 2010

В настоящее время нет простого способа сделать это «встроенным», но вы можете легко реализовать его, обернув InputStream, который вы передаете, чтобы сообщить о том, как далеко он читается.

Вы можете прочитать официальный ответ команды на этот вопрос на их форумах.

Также стоит отметить, что в .NET SDK есть , но насколько я знаю, этореализован таким же «хакерским» способом (просто, сам API S3 на самом деле не имеет встроенных условий для этого).Если у вас возникли проблемы с его самостоятельным внедрением, это может стать источником вдохновения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...