2012-03-15 81 views
0

使用下面的代码我可以从url加载任何文件作为字节 但这种方式适用于文件不大于256kb。通过HttpConnection下载大文件

所以我想另一种方式来加载较大的文件的字节,而无需使用BlackBerry Combiner

我的代码:

HttpConnection hpc = null; 
    try { 
     hpc = (HttpConnection) Connector.open(url 
       + ConnectionManager.getTimeOut(5000) 
       + ConnectionManager.updateConnectionSuffix()); 
     hpc.setRequestMethod(HttpConnection.GET); 
     hpc.setRequestProperty("Connection", "Keep-Alive"); 
     if (hpc.getResponseCode() != 200) { 
      return null; 
     } 
     byte[] data = IOUtilities.streamToBytes(hpc.openInputStream()); 
     hpc.close(); 
     return data; 
    } catch (Exception e) { 
     return null; 
    } 

回答

0

我试图调整BlackBerry Combiner 使用它下载大文件的字节数。它为我工作得很好 下面

列出的代码---调用

byte[] data = downloadLargeFiles(url); 
       if (data != null) { 
        invoke(data.length + " "); 
        Bitmap bitmap = Bitmap.createBitmapFromBytes(data, 0, 
          data.length, 1); 
        manager.add(new BitmapField(bitmap)); 
       } 

---功能

public byte[] downloadLargeFiles(String url) throws Exception { 
    int chunkIndex = 0; 
    int totalSize = 0; 

    String currentFile = url + ConnectionManager.getTimeOut(5000) 
      + ConnectionManager.updateConnectionSuffix(); 
    HttpConnection conn; 
    InputStream in; 
    int rangeStart = 0; 
    int rangeEnd = 0; 
    int chunksize = 100000; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    while (true) { 
     conn = (HttpConnection) Connector.open(currentFile, 
       Connector.READ_WRITE, true); 
     rangeStart = chunkIndex * chunksize; 
     rangeEnd = rangeStart + chunksize - 1; 
     conn.setRequestProperty("Range", "bytes=" + rangeStart + "-" 
       + rangeEnd); 
     int responseCode = conn.getResponseCode(); 
     if (responseCode != 200 && responseCode != 206) { 
      // Dialog.alert("End "+responseCode); 
      break; 
     } 
     in = conn.openInputStream(); 
     int length = -1; 
     byte[] readBlock = new byte[256]; 
     int fileSize = 0; 
     while ((length = in.read(readBlock)) != -1) { 
      bos.write(readBlock, 0, length); 
      fileSize += length; 
      Thread.yield(); // Try not to get cut off 
     } 
     totalSize += fileSize; 
     chunkIndex++; // index (range) increase 
     in.close(); 
     conn.close(); 
     in = null; 
     conn = null; 

     Thread.sleep(1000); 
    } 
    bos.close(); 

    return bos.toByteArray(); 
} 

感谢

1

的限制是由MDS,这是黑莓设备和之间的代理征收互联网。 BIS和BES服务器都是MDS。因此,如果不删除限制,您将不得不拆分下载,以适应您的最大数据大小。 HTTP协议已经通过Range请求头支持这个功能,因为它在DownloadCombiner示例中显示,不需要制定自己的机制。 这是保证下载任意大小文件的唯一方法。

这就是说,根据你的情况,也有一些方法可以删除/绕过限制:

  • 如果你的设备是BES里面,你可以跟BES管理员来增加下载数据尽可能每个连接的大小。 BES配置中的最大可用值取决于BES版本,因此即使最大也不足以下载超过该限制的文件。 (但是如果你的文件小于限制,那么这是下载文件而不修改代码的最快方式)。

  • 如果你在你的本地计算机仿真测试,看看这个文件:

    <JDE path>\MDS\config\rimpublic.property<br><br> 
    

    找到行IPPP.connection.MaxNumberOfKBytesToSend,并增加它来满足您的需求。这不是好的做法,因为你的应用在模拟器中运行良好,但在真实设备上会失败。始终希望保持模拟器行为尽可能接近真实设备。

  • 如果您是通过BIS,那么限制是固定的,并且将取决于HTTP响应中返回的MIME类型,因为它解释为here。多媒体MIME类型的最大尺寸限制为122,880 KB。因此,如果您需要从受控制的服务器下载超过2048 KB的PDF文件,则可能会发生黑客行为,将该文件重命名为多媒体扩展名,将响应中返回的MIME类型更改为多媒体扩展名,然后在您的设备中下载后,再次重新命名为其原始扩展名。如果托管该文件的服务器不在您的控制之下,您可以在两者之间设置一个代理服务器来下载它并将欺骗文件提供给设备。如你所见,这是一项太多的工作,使用DownloadCombiner会更快。您仍然必须解决了解原始文件实际扩展的问题。最后你被困在122,880 KB,所以它不适用于超过这个尺寸的文件。

+0

伟大的答案。我没有意识到大小限制,并认为由于'IOUtilities.streamToBytes(hpc.openInputStream())'产生了问题。上传有没有类似的限制? – mrvincenzo 2012-03-17 09:57:00

+0

我上面发布的代码使用这种方法IOUtilities.streamToBytes(hpc.openInputStream())并且仍然不起作用。所以问题出现的原因。 – 2012-03-17 13:59:19

+0

@ahmed Shoeib当连接建立(列表中的'getResponseCode')时发生413,而不是超过下载限制。 – 2012-03-19 08:27:19