首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过HttpConnection下载大文件

通过HttpConnection下载大文件
EN

Stack Overflow用户
提问于 2012-03-15 21:14:48
回答 2查看 1.9K关注 0票数 0

使用下面的代码,我可以从url加载任何一个字节的文件,但这种方式对不超过256kb的文件很好。

所以我想要另一种方法来加载更大的文件为字节而不使用BlackBerry Combiner

我的代码:

代码语言:javascript
复制
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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-19 17:20:32

我尝试将BlackBerry Combiner调整为在下载大文件为字节时使用。下面列出的代码对我来说很好。

-呼叫

代码语言:javascript
复制
byte[] data = downloadLargeFiles(url);
                if (data != null) {
                    invoke(data.length + " ");
                    Bitmap bitmap = Bitmap.createBitmapFromBytes(data, 0,
                            data.length, 1);
                    manager.add(new BitmapField(bitmap));
                }

-函数

代码语言:javascript
复制
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();
}

谢谢

票数 0
EN

Stack Overflow用户

发布于 2012-03-16 20:12:06

该限制是由作为BlackBerry设备和互联网之间的代理的MDS施加的。BIS和BES服务器都是MDS。因此,在不消除限制的情况下,您必须拆分您的下载以适应您最大的数据大小。HTTP协议已经通过Range请求报头支持此功能,如DownloadCombiner示例所示,不需要创建自己的机制。这是保证下载任意大小的文件的唯一方法。

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

  • 如果您的设备在BES中,您可以与BES管理员沟通,以尽可能增加每个连接的下载数据大小。BES配置中的最大可用值取决于BES版本,因此即使是最大值,也可能不足以下载超过该限制的文件。(但如果您的文件小于限制,则这是无需修改代码即可下载文件的最快方法)。
  • 如果您在本地计算机的模拟器中进行测试,请查找以下文件:

\MDS\config\rimpublic.property

找到IPPP.connection.MaxNumberOfKBytesToSend行并增加它以满足您的需要。这不是一个好的实践,因为您的应用程序将在模拟器中运行良好,但在真实设备上将失败。总是希望你的模拟器行为尽可能地接近真实设备。

  • 如果你超过了BIS,那么限制是固定的,并且会随着here响应中返回的MIME类型的不同而不同。多媒体MIME类型的最大大小限制为122,880 KB。因此,如果你需要从你控制的服务器上下载一个超过2048KB的pdf文件,你可以像黑客一样,将文件重命名为多媒体扩展名,更改响应多媒体扩展名时返回的MIME类型,然后一旦下载到您的设备中,再次重命名为其原始扩展名。如果托管该文件的服务器不在您的控制之下,您可以在两者之间设置一个代理服务器来下载该文件并将欺骗的文件提供给设备。如你所见,这是一项太多的工作,使用DownloadCombiner的速度要快得多。你仍然需要解决知道原始文件实际扩展名的问题。最后,您会遇到122,880 KB的大小,因此它不适用于超过此大小的文件。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9720455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档