Проблема с BlackBerry при загрузке видеофайла на сервер ... не все байты отправляются из DataOutputStream - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть интересная проблема, с которой я столкнулся в своем приложении BlackBerry. На телефоне есть небольшие видеофайлы, которые мы хотим загрузить в службу, работающую на нашем Сервере, используя протокол POST Http и составную форму. Последовательность следующая:

  1. Получить дескриптор видеофайла на /SDCard/BlackBerry/videos/.MP4
  2. Получите дескриптор файла InputStream, чтобы мы могли получить байты, которые нам понадобятся для отправки через OutputSteam нашего соединения Http.

Просто, правда. Вот код (обычная проверка ошибок / обработка исключений для духовности):

    int bytesRead = 0;
    String boundary = "**********";
    byte[] buffer = new byte[ 1024 * 64 ];

    InputStream fileIS = file.openInputStream();

    httpCon.setRequestMethod( HttpConnection.POST );
    httpCon.setRequestProperty( "Connection", "Keep-Alive" );
    httpCon.setRequestProperty( "Content-Type", "multipart/form-data; boundary=" + boundary );

    DataOutputStream dos = httpCon.openDataOutputStream();
    dos.write( ("\r\n--" + boundary + "\r\n").getBytes("UTF-8") );
    dos.write( ("Content-Disposition: form-data; name=\"videofile\"; filename=\"" + myFileName + "\"" + "\r\n").getBytes("UTF-8") );

    while ( (bytesRead = fileIS.read( buffer )) != -1 )
    {
        dos.write( buffer, 0, bytesRead );
    }

    dos.write( ("\r\n--" + boundary + "--\r\n").getBytes("UTF-8") );
    dos.flush();

    // From this point we do additional processing and close out our various 
    // Streams we've opened.

По какой-то странной причине Сервер не получает все байты. У меня будет, например, файл, имеющий 100 000 байтов, но Сервер получит только 99 640 из них. Потеря всегда очень мала, но, честно говоря, не должно быть ЛЮБОЙ потери.

Что делает вещи более интересными, так это использование браузера телефона. Я отлично загружаю те же видеофайлы на наш Сервер, и весь файл благополучно доставляется. Но когда мы делаем это программно, мы всегда теряем небольшое количество байтов, что портит видео и делает его неиграемым.

Есть мысли о том, почему это происходит? Буду признателен за любые мысли или предложения.

Спасибо.

1 Ответ

0 голосов
/ 26 февраля 2012

У меня нет конкретного ответа, но есть куча идей:

  1. Я думаю, что используемая вами граница ********** недопустима.Судя по RFC1341 (7.2.1 Multipart: общий синтаксис), "*" (звездочка) не является допустимым символом.Попробуйте изменить границу на другую. Граница формально определяется следующей БНФ:

    Граница: = 0 * 69 bcharsnospace
    bchars: = bcharsnospace / ""
    bcharsnospace: =DIGIT / ALPHA / "'" / "(" / ")" / "+" / "_" / "," / "-" / "."/ "/" / ":" / "=" / "?"

  2. Возможно ли, что сама граница закрытия появляется внутри инкапсулированной части?Вероятно, очень маловероятно.

  3. Относительно dos.write( ("\r\n--" + boundary = "--\r\n").getBytes("UTF-8") ) - является ли знак равенства в boundary = "--\r\n" опечаткой copy & paste ?Если это не так, то это может быть.

...