Сбой PhoneGap при использовании передачи файлов для загрузки видео размером более 15 МБ - PullRequest
2 голосов
/ 20 января 2012

Проверено на Android, Samsung Galaxy S, версия телефонного зазора: 1.3.0

Я создаю пользовательский загрузчик видео для сообщества.

Все попытки с использованием файлов размером менее 15 МБ (примерно) работают как чудо, либо если выбрать файл из библиотеки или записать видео и затем загрузить его.

Я пробовал это на двух разных серверах с настройками php ini выше того, что требуется. Я пробовал chunkedMode = false;

Проблема по-прежнему сохраняется, разрыв телефонной связи, если видео больше 15 миллибар Все файлы до 15 МБ работают очень хорошо.

Phonegap даже не возвращает ошибку, просто вылетает. Я безуспешно пытался вставить оператор try catch.

Вот мой код (очень простой для тестирования):

<!DOCTYPE html>
<html>
  <head>
    <title>Video Uploader</title>
    <meta name="viewport" content="width=device-width, initial-
scale=1">
    <link rel="stylesheet" href="master.css" type="text/css" />
    <script type="text/javascript" charset="utf-8"
src="phonegap-1.3.0.js"></script>
    <script type="text/javascript" charset="utf-8">
        function onLoad() {
        document.addEventListener("deviceready",onDeviceReady,false);
    }
        function onDeviceReady() {
                pictureSource=navigator.camera.PictureSourceType;
            destinationType=navigator.camera.DestinationType;
    }
    function uploadFile(mediaFile,method) {
                var ft = new FileTransfer(),
            path = mediaFile,
            name = "video.3gp";
        var options = new FileUploadOptions();
                options.chunkedMode = false;
                        options.fileKey = "file";
                        options.fileName = name;
                        options.mimeType = "video/mpeg";
        ft.upload(path,
            "http://www.myserver.com/upload.php",
            function(r) {
                        alert('Success ' + r.response);
            },
            function(error) {
                        alert('Error ' + path + ': ' + error.code);
            },
            options);
    }
    function onPhotoURISuccess(imageURI) {
                uploadFile(imageURI,"library");
    }
    function getVideo(source, type) {
            navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality:
50, destinationType: destinationType.FILE_URI, sourceType: source,
mediaType: type});
    }
    function onFail(message) {
        alert('Error');
    }
    </script>
  </head>
  <body onload="onLoad()">
        <button class="btn"
onclick="getVideo(pictureSource.PHOTOLIBRARY,Camera.MediaType.VIDEO);">Get
Video</button>
  </body>
</html>

Любой совет по этому вопросу будет высоко ценится!

Спасибо!

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Вам нужно установить

options.chunkedMode=true;

Когда режим chunked имеет значение false, HTTP-код на Android пытается буферизовать всю передачу в памяти перед отправкой. С большими передачами 15 Мб в вашем случае, но для других телефонов это будет еще меньше, так как у них будет меньше памяти, это вызовет исключение OutOfMemory. Поскольку OOME никогда не должен быть перехвачен, приложение будет аварийно завершено.

Если для параметра chunked mode установлено значение true, тогда код HTTP на Android пытается использовать потоковый режим для отправки информации на сервер. Не все серверы поддерживают потоковый режим, но большинство поддерживают.

Относительно того, почему он терпит неудачу на 40+ мб, я немного растерялся, если в вашем файле php.ini не указан самый большой размер файла, который он примет.

0 голосов
/ 20 января 2012

Вы пытались распечатать какие-либо операторы отладки на вашем PHP-скрипте, просто чтобы увидеть, что происходит не так?

Ваш клиентский код выглядит нормально, и я использую практически идентичный код без каких-либо проблем.Мне удалось загрузить видеофайлы размером около 40 МБ с объектом PhoneGap FileTransfer.

Другой вариант может заключаться в создании копии FileTransfer в качестве пользовательского плагина.Затем вы можете установить точку останова в Java-коде, чтобы увидеть, что происходит не так.

Извините, я не могу больше помочь, поскольку это только сработало для меня!

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