2012-03-15 77 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