如何监控文件上传进度?

我需要将文件上传到服务器并监视它的进度。 我需要通知每次发送多少字节。

例如,在下载的情况下,我有:

HttpURLConnection connection = (HttpURLConnection) m_url.openConnection(); connection.connect(); InputStream stream = connection.getInputStream(); while ((currentBytes = stream.read(byteBuffer)) > 0) { totalBytes+=currentBytes; //calculate something... } 

现在我需要为上传做同样的事情。 但如果使用

 OutputStreamWriter stream = new OutputStreamWriter(connection.getOutputStream()); stream.write(str); stream.flush(); 

我得不到任何进程通知,关于发送了多少字节(看起来像自动操作)。

有什么建议么?

谢谢

只需设置分块传输模式并监控自己对输出流的写入。

如果不使用分块或固定长度传输模式,则在写入网络之前,所有写入都将写入ByteArrayOutputStream,以便Java可以正确设置Content-Length标头。 这就是让你认为它是非阻塞的。 事实并非如此。

我使用过ChannelSocket对象。 此对象允许在访问服务器时执行阻塞读写操作。 因此,我使用此套接字模拟HTTP,并且每个写入请求都被阻止,直到它完成。 这样我就可以按照写事务的实际进度。

我在类似情况下所做的是创建一个FilterOutputStream的子类,它覆盖write(…)方法,然后可以通知代码任何写入的字节。

如果要计算要上载的字节数,请将对象作为字节数组写入输出流本身,就像使用输入流一样。

它类似于下载的工作方式。

 OutputStream stream = connection.getOutputStream(); for(byte b: str.getBytes()) { totalBytes+=1; stream.write(b); if(totalBytes%50 == 0) stream.flush(); //bytes will be sent in chunks of 50 //calculate something... } stream.flush(); 

这样的事情。

另一种方法是轮询服务器,询问上载了多少数据。 也许使用id或者其他东西。

POST – > / uploadfile

  • ID
  • 文件

POST – > / queryuploadstate(返回部分大小)

  • ID

当然它需要连接servlet并且不允许集群……