通过HttpConnection下载大文件

时间:2012-03-15 13:14:48

标签: http blackberry

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

所以我想用另一种方法将较大的文件作为字节加载而不使用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;
    }

2 个答案:

答案 0 :(得分:1)

MDS是限制,它是BlackBerry设备和互联网之间的代理。 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,因此它不适用于超过这个大小的文件。

答案 1 :(得分: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();
}

谢谢