如何监控文件上传进度?

时间:2011-06-09 14:42:26

标签: java post upload

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

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

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

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

有什么建议吗?

由于

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

类似的东西。

答案 5 :(得分:0)

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

POST - > / uploadfile

  • ID
  • 文件

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

  • ID

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