我需要将文件上传到服务器并监控其进度。 我需要通知每次发送多少字节。
例如,在下载的情况下,我有:
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();
比我无法获得任何进程通知,关于发送了多少字节(看起来像自动操作)。
有什么建议吗?
由于
答案 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
POST - > / queryuploadstate(返回部分大小)
当然需要连接servlet并且不允许群集......