2012-05-29 36 views
3

我想使用HttpConnection将文件上传到服务器。所以我想制作一个代表上传作业百分比的GaugeField。使用Http连接上传文件并计算上传字节的百分比

但是我在OutputStream中找到的所有内容都是.flush(),它将整个输出流刷新到服务器。所以我无法计算在特定时间上传的字节数

如何做到这一点?任何想法?

我用下面的,但它给错误的大部分时间:

  while (position < length) { 
       try { 
        os.write(postDataBytes, position, length100); 
        position += length100; 
        int location = position * 100/length; 
        gaugeField.setValue(location); 
        os.flush(); 
       } 
      } 
+0

每次发送1M(或其他合适的增量),并在每次发送后更新百分比。 –

+0

@DavidWallace如何做到这一点?我更新了关于如何使用它的问题,但这在大多数情况下都会失败......所以我以错误的方式使用它 –

+1

基本思路看起来大致正确。当你说“大多数时候失败”是什么意思?究竟发生了什么?什么是你的代码中的length100--从哪里来的? –

回答

2

有两种方法做到这一点:

  • 客户端:识别字节,客户端已经写入(这是不正确的,因为您不知道数据是否真的到达了服务器)。在这种情况下,您应该通过为您提供自定义SocketFactory并封装底层套接字来计算写入的字节。
  • 服务器端:最好的方法是保持服务器在会话中读取数据的计数,并让客户端发出请求以了解上传进度。

下面是实现这一目标的步骤:

1)在上传的Servlet在服务器端更新会话读取的字节。

session.setAttribute(pBytesRead); 

2)写入一个servlet UploadProgressServlet其写入进展到响应。

response.getOutputStream().write(session.getAttribute("uploadprogress")); 

3)让客户端发出请求到UploadProgressServlet知道进度

你也可以使用Apache Commons Upload API其中有进展监听器的支持。在这种情况下,您必须以多部分格式写入数据。

+0

您是否有一个关于如何在真正的Blackberry代码中工作的示例? –

+0

从哪里获得图书馆?在JDE –

+0

中没有识别出这样的代码我已经更新了答案,可以看看它。询问我是否有任何问题。 –

0

你可以使用方法

write(byte[] b, int off, int len); 

,并根据offset变量计算百分比。

+0

此方法写入输出流,但不刷新。我试过了,但是直到所有的字节被写入后,响应才会进入服务器。 –