Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用进度回调将文件或InputStream上载到S3_Java_Amazon S3 - Fatal编程技术网

Java 使用进度回调将文件或InputStream上载到S3

Java 使用进度回调将文件或InputStream上载到S3,java,amazon-s3,Java,Amazon S3,我们正在使用Amazon AWS Java库上传一个文件,很难获得上传进度。我们目前正在拨打以下电话: File file = new File(localAsset.getVideoFilePath()); PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, localAsset.getFileName(), file); s3.putObject(putObjectRequest); 我们如何设置回调以检查文件上

我们正在使用Amazon AWS Java库上传一个文件,很难获得上传进度。我们目前正在拨打以下电话:

File file = new File(localAsset.getVideoFilePath());
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, localAsset.getFileName(), file);
s3.putObject(putObjectRequest);
我们如何设置回调以检查文件上载进度


谢谢,目前还没有“内置”的简单方法,但是您可以通过包装传入的输入流来报告读取的距离,从而轻松实现一种方法

你可以在他们的论坛上阅读这个问题的答案


可能还值得注意的是,.NETSDK确实具有此功能,尽管据我所知,它是以类似的“黑客”方式实现的(简单地说,S3API本身并没有内置的规则来优雅地实现这一点)。如果您自己在实现它时遇到困难,那可能是一个寻找灵感的地方。

我遇到了这个问题,并编写了一个简单的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;
    }
}
import java.io.IOException;
导入java.io.InputStream;
导入org.apache.commons.vfs.FileContent;
导入org.apache.commons.vfs.FileSystemException;
公共类ProgressInputStream扩展了InputStream{
私人最终长尺寸;
私有长进度,lastUpdate=0;
私有最终输入流InputStream;
私有最终字符串名;
私有布尔闭合=假;
public ProgressInputStream(字符串名称、InputStream InputStream、长大小){
这个。大小=大小;
this.inputStream=inputStream;
this.name=名称;
}
public ProgressInputStream(字符串名称、文件内容)
抛出FileSystemException{
this.size=content.getSize();
this.name=名称;
this.inputStream=content.getInputStream();
}
@凌驾
public void close()引发IOException{
super.close();
如果(关闭)抛出新IOException(“已关闭”);
关闭=真;
}
@凌驾
public int read()引发IOException{
int count=inputStream.read();
如果(计数>0)
进度+=计数;
lastUpdate=maybeUpdateDisplay(名称、进度、lastUpdate、大小);
返回计数;
}
@凌驾
公共整数读取(字节[]b,整数关闭,整数长度)引发IOException{
int count=inputStream.read(b,off,len);
如果(计数>0)
进度+=计数;
lastUpdate=maybeUpdateDisplay(名称、进度、lastUpdate、大小);
返回计数;
}
静态long-maybeUpdateDisplay(字符串名称、长进度、长上次更新、长大小){
if(Config.isinunitests())返回lastUpdate;
如果(大小1024*10){
lastUpdate=进度;
int散列=(int)((双)进度/(双)大小)*40);
如果(哈希>40)哈希=40;
String bar=StringUtils。重复(“#”,
散列);
bar=StringUtils.rightPad(bar,40);
System.out.format(“%s[%s].2fMB/%.2fMB\r”,
名称、栏、进度(单位:MB)、大小(单位:MB);
System.out.flush();
}
返回最新更新;
}
}
(这是从实时代码中复制和粘贴的,因此您可能需要进行一些修复,以使其在您自己的代码中工作。)


然后,只需使用InputStream方式来放置内容(确保指定大小!),它将为您提供一个很好的进度条。如果您想要一个合适的回调,那么这也很容易做到。

使用进度侦听器跟踪进度

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);

@koti应为兆字节(1024^3):)