如何监控文件上传进度?
我需要将文件上传到服务器并监视它的进度。 我需要通知每次发送多少字节。
例如,在下载的情况下,我有:
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并且不允许集群……