Хобрук: Ваш путь к мастерству в программировании

Загрузка Cordova FileTransfer — всегда возвращает ошибку 3

Я столкнулся с некоторыми проблемами при использовании плагина Cordova File Transfer. Это мой код:

window.requestFileSystem(
    LocalFileSystem.PERSISTENT,
    0,
    function onFileSystemSuccess(fileSystem) {
        fileSystem.root.getFile(
            "dummy.html", {create: true, exclusive: false},
            function gotFileEntry(fileEntry) {
                var sPath = fileEntry.fullPath.replace("dummy.html", "");
                var fileTransfer = new FileTransfer();
                fileEntry.remove();

                fileTransfer.download( 'http://cordova.apache.org/images/cordova_bot.png', sPath + photo.original_name,
                    function (theFile) {
                        alert('success: ' + JSON.stringify(theFile));
                        console.log("download complete: " + theFile.toURI());
                        // showLink(theFile.toURI());
                    },
                    function (error) {
                        alert('error: ' + JSON.stringify(error));
                        console.log("download error source " + error.source);
                        console.log("download error target " + error.target);
                        console.log("upload error code: " + error.code);
                    },
                    true
                );
            })
    },
    function (error) {
        alert('error request: ' + JSON.stringify(error));
    }
);

Обратный вызов ошибки fileTransfer.download возвращается с кодом ошибки 3, http 401. Я уже обновил плагины File и FileTransfer, моя версия Cordova — 4.3.0. Также проверил мой config.xml для

<access origin="*" />

но он есть. Я попытался добавить заголовок Connection: close, но безрезультатно. Пробовал также установить 4-й параметр загрузки по умолчанию (false) - не повезло.

Тестирование на планшете Android.

Кто-нибудь что-нибудь? Спасибо!


  • есть ли у планшета интернет? ошибка 3 года проблема с подключением 15.04.2015
  • Да, это так. Приложение возвращает ошибку с кодом 3 и http_status 401, тело: null, исключение: null 15.04.2015
  • URL-адрес тот, что в вашем примере? 15.04.2015
  • Да, то же самое (cordova.apache.org/images/cordova_bot.png) в моем коде прямо сейчас - я поставил его, потому что думаю, что это должно работать. Но, к сожалению, это не так. 15.04.2015
  • Какая версия кордовы-андроид? Получено путем запуска cordova platform ls. 17.04.2015
  • Там написано: андроид 3.4.0 17.04.2015

Ответы:


1

Только что нашел "решение" своей проблемы. Что я сделал, так это понизил версию плагина для передачи файлов с 0.5.0 до 0.4.8.

Если кто-то когда-либо столкнется с подобной проблемой, сделайте следующее:

  1. Удалите существующий плагин для передачи файлов, запустив «список плагинов Cordova», а затем «плагин Cordova удалить имя_из_списка».
  2. Перейдите по адресу https://github.com/apache/cordova-plugin-file-transfer/releases и загрузите zip-файл версии 0.4.8.
  3. Разархивируйте файл в корень вашего приложения Cordova.
  4. Запустите 'плагин Cordova, добавьте путь_к_распакованной_папке'

Вот и все. Кажется, работает хорошо, по крайней мере, обратный вызов успеха возвращается, на самом деле больше не проверял.

18.04.2015
  • Вы также можете добавить указанную версию с помощью Cordova :) просто запустите cordova plugin add [email protected], чтобы добавить указанную версию. 20.04.2015
  • У меня была аналогичная проблема с установкой Cordova-plugin-whitelist, и ее настройка решила проблему. 14.05.2015
  • Спасибо! Мне это тоже помогло. 18.05.2015

  • 2

    Лично я бы не стал создавать файл, а затем удалять его только для того, чтобы получить URL-адрес каталога. Вы должны иметь возможность получить именно это, выполнив fileSystem.root.toURL() - fileSystem.root является DirectoryEntry и поэтому содержит методы, которые вы ожидаете увидеть в DirectoryEntry.

    Просто немного быстрее.

    Обновить

    Если вы склонны использовать метод удаления файла, вам следует использовать toURL() для FileEntry, а не fullPath. Я думаю, что toURL() возвращает URL-адрес, который можно использовать в приложении HTML.

    Но, как я уже сказал, предпочтительнее использовать fileSystem.root.toURL(). Пример кода выглядит следующим образом:

    Таким образом, ваш код становится:

    window.requestFileSystem(
        LocalFileSystem.PERSISTENT,
        0,
        function (fileSystem) {
            var url = 'http://cordova.apache.org/images/cordova_bot.png',
                dir = fileSystem.root.toURL() + photo.original_name,
                ft = new FileTransfer();
    
            ft.download(url, dir,
                function (fileEntry) {
                    alert('Downloaded!');
                },
                function (error) {
                    alert('Download error');
                    console.log(dir);
                }
            );
        },
        function (error) {
            alert('Error getting file system');
        }
    );
    

    Попробуйте это и посмотрите, что произойдет. Может показаться глупым, но я предполагаю, что photo.original_name определено? И есть ли '/' между каталогом и именем файла?

    16.04.2015
  • Спасибо за ваше время. К сожалению, ваше решение не работает для меня, оно такое же, как и было. Я также пытался проверить photo.original_name на строку, но безрезультатно. Я тестирую на планшете Prestigio, но мне только что удалось запустить его на SGS4, и результат тот же. код ошибки 3, http_status 401 17.04.2015
  • И точный URL-адрес: file:///storage/emulated/0/cordova_bot.png. И это наверное не мой коннект, я переключил вайфай на 4g, все так же - 401 17.04.2015
  • Какую версию Cordova-android вы используете? Если вы запустите cordova platform ls в каталоге вашего проекта, он должен сказать там. 18.04.2015

  • 3

    Если для доступа к вашему удаленному файлу требуется VPN, убедитесь, что ваше устройство подключено к VPN.

    В моем случае я не был подключен к VPN на устройстве.

    03.01.2019

    4

    Просто измените URL-адрес загрузки на http://www.{{Доменное имя}}/abc.pdf

    использовать полный URL с www

    09.01.2020

    5

    Это сработало для меня

    let pathToDownload = `${cordova.file.externalDataDirectory}`;
    let fileTransfer   = new FileTransfer();    
    let url            = encodeURI(`https://cordova.apache.org/images/cordova_bot.png`);
    
    fileTransfer.download(url, pathToDownload + "image.png",
        (fileEntry) => {
            console.log('Downloaded!');
        },
        (error) => {
            console.log('Download error');           
        },                      
    );
    
    23.04.2020
    Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..