Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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 Sonatype异步HTTP客户端上载进度_Java_File Upload_Asynchronous_Progress - Fatal编程技术网

Java Sonatype异步HTTP客户端上载进度

Java Sonatype异步HTTP客户端上载进度,java,file-upload,asynchronous,progress,Java,File Upload,Asynchronous,Progress,我正在尝试使用sonatype异步http客户端实现异步文件上载 我尝试了文档中建议的方法。使用传输侦听器。 我实现了TransferListener接口的onBytesSent(与测试一样): 然后在另一个线程中(因为我不想阻止应用程序),我尝试执行以下操作: TransferCompletionHandler tl = new TransferCompletionHandler(); tl.addTransferListener(listener); asyncHttpClient.pr

我正在尝试使用sonatype异步http客户端实现异步文件上载

我尝试了文档中建议的方法。使用传输侦听器。

我实现了TransferListener接口的onBytesSent(与测试一样):

然后在另一个线程中(因为我不想阻止应用程序),我尝试执行以下操作:

TransferCompletionHandler tl = new TransferCompletionHandler();
tl.addTransferListener(listener);

asyncHttpClient.preparePut(getFullUrl(fileWithPath))
      .setBody(new BodyGenerator() {
           public Body createBody() throws IOException {
                return new FileBodyWithOffset(file, offset);
           }
       })
       .addHeader(CONTENT_RANGE, new ContentRange(offset, localSize).toString())
       .execute(handler).get();
一切都很好。文件上传正确且速度非常快。但问题是-我只在上传完成后从TransferListener中的
onBytesSent
收到消息。对于exmaple,上传在10分钟内完成。在那10分钟里我什么也没得到。只有在这之后,所有内容都会打印在控制台上

我想不出这个代码有什么问题。我只是试着去看医生

我试图在主线程中执行上面的代码,但也没有成功


使用此客户端实现上载进度侦听器可能是一种错误的方法

我自己来回答。我没有设法解决TransferListener的问题。所以我试了另一种方法

我已将progress logick放入Body接口实现中(内部读取方法):

也许这是一个肮脏的把戏,但至少它是有效的

TransferCompletionHandler tl = new TransferCompletionHandler();
tl.addTransferListener(listener);

asyncHttpClient.preparePut(getFullUrl(fileWithPath))
      .setBody(new BodyGenerator() {
           public Body createBody() throws IOException {
                return new FileBodyWithOffset(file, offset);
           }
       })
       .addHeader(CONTENT_RANGE, new ContentRange(offset, localSize).toString())
       .execute(handler).get();
public class FileBodyWithOffset implements Body {

    private final ReadableByteChannel channel;

    private long actualOffset;

    private final long contentLength;

    public FileBodyWithOffset(final File file, final long offset) throws IOException {

        final InputStream stream = new FileInputStream(file);

        this.actualOffset = stream.skip(offset);

        this.contentLength = file.length() - offset;

        this.channel = Channels.newChannel(stream);
    }


    public long getContentLength() {

        return this.contentLength;
    }

    public long read(ByteBuffer byteBuffer) throws IOException {

        System.out.println(new Date());

        actualOffset += byteBuffer.capacity();

        return channel.read(byteBuffer);
    }

    public void close() throws IOException {

        channel.close();
    }

    public long getActualOffset() {

        return actualOffset;
    }
}