Загрузка большого файла через HttpConnection - PullRequest
0 голосов
/ 15 марта 2012

Используя следующий код, я могу загрузить любой файл из URL в виде байтов, но этот способ отлично работает для файла размером не более 256 КБ.

Поэтому я хочу еще один способ загрузки больших файлов в байтах без использования 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 ]

1 голос
/ 16 марта 2012

Ограничение накладывается MDS, который является прокси между устройством BlackBerry и Интернетом.Серверы BIS и BES являются MDS.Таким образом, не снимая ограничения, вам придется разделить загружаемые файлы так, чтобы они соответствовали каждому из них с наибольшим размером данных.Протокол HTTP уже поддерживает эту функцию через заголовок запроса Range, как показано в примере DownloadCombiner, нет необходимости создавать собственный механизм. Это единственный способ гарантировать загрузку файлов произвольного размера .

При этом в зависимости от вашего случая есть несколько способов снять / обойти ограничение:

  • Если ваше устройство находится внутри BES, вы можете поговорить с администратором BES, чтобы максимально увеличить размер загружаемых данных на соединение.Максимальное доступное значение в конфигурации BES зависит от версии BES, поэтому даже при максимуме его может быть недостаточно для загрузки файлов, превышающих этот предел.(Но если ваши файлы меньше предела, это самый быстрый способ загрузки файлов без изменения кода).

  • Если вы тестируете в симуляторе на локальном компьютере, посмотритедля этого файла:

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

    Найдите строку IPPP.connection.MaxNumberOfKBytesToSend и увеличьте ее в соответствии со своими потребностями.Это не очень хорошая практика, потому что ваше приложение будет нормально работать в симуляторах, но не будет работать на реальных устройствах.Всегда желательно, чтобы поведение вашего симулятора было как можно ближе к реальным устройствам.

  • Если вы превышаете BIS, то ограничения фиксированы и будут варьироваться в зависимости от типа MIME, возвращаемого вответ HTTP, как это объяснено здесь .Типы мультимедиа MIME имеют наибольший предел размера в 122 880 КБ.Поэтому, если вам нужно загрузить, скажем, файл PDF размером более 2048 КБ с сервера, находящегося под вашим контролем, вы можете пойти взломать, переименовать файл в расширение для мультимедиа, изменить тип MIME, возвращаемый в ответ на мультимедийный, а затем после загрузки на устройство снова переименуйте его в исходное расширение.Если сервер, на котором находится файл, не находится под вашим контролем, вы можете настроить промежуточный прокси-сервер для его загрузки и передачи подделанного файла на устройство.Как вы видите, это слишком трудоемкий процесс, он намного быстрее использует DownloadCombiner.Вы все еще должны решить проблему знания оригинального расширения файла.И, наконец, вы застряли с 122 880 КБ, поэтому он не работает для файлов, размер которых превышает этот размер.

0 голосов
/ 19 марта 2012

Я попытался настроить 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();
}

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...