cordova-plugin-filepath: невозможно разрешить URI как путь к файлу

После выбора видеофайла из файловой системы моего устройства с помощью метода cordova-plugin-camera navigator.camera.getPicture() функция возвращает URI, например 'content://media/external/video/media/7319' (android).

Это должно быть преобразовано в путь к файлу для загрузки файла с помощью функции cordova-plugin-file-transfers 'upload()' (которая принимает только собственные пути или данные: URI). data:URI не подходит, так как мы должны передавать довольно большие файлы (5 МБ+), преобразование которых в base64 занимает слишком много времени.

По словам разработчика, существует совсем недавняя проблема, которая препятствует разрешению операция.

Есть ли другие методы, которые будут работать как на Android, так и на iOS? Или мне нужно отказаться от передачи файлов Cordova-plugin для другого метода загрузки?


person Ammul    schedule 21.01.2016    source источник
comment
Вы проверили github.com/apache/cordova-plugin-camera? Этот плагин имеет возможность вернуть путь к файлу, который можно использовать для легкой передачи файла на сервер. и, кстати, вы используете ionic framework? если да, попробуйте использовать этот плагин ngcordova.com/docs/plugins/capture, он тоже задокументирован!   -  person 404    schedule 21.01.2016
comment
@ 404 спасибо за ваш комментарий, но Cordova-plugin-camera — это плагин, который я использую прямо сейчас (должен был упомянуть об этом). Да, я использую ionic, но ngCordova/../capture не предоставляет метод загрузки файлов из хранилища устройств. Согласно документам, он может записывать новые файлы только с камеры.   -  person Ammul    schedule 22.01.2016


Ответы (1)


Немного поздно, но вы можете использовать cordova-plugin-file вместо cordova-plugin-filepath, как предлагается в документация Cordova:

navigator.camera.getPicture(function cameraSuccess(imgUri) {
    uploadPicture(imgUri);
}, function cameraError(error) {
    console.debug("Unable to obtain picture: " + error, "app");
});

function uploadPicture(imgUri) {
    var uploadUrl = ...;
    var success = ...;
    var fail = ...;
    var options = ...;

    var fileEntry = getFileEntry(imgUri);
    var fileTransfer = new FileTransfer();
    fileTransfer.upload(fileEntry.toURL(), encodeURI(uploadUrl), success, fail, options);
}

function getFileEntry(imgUri) {
    window.resolveLocalFileSystemURL(imgUri, function success(fileEntry) {
        return fileEntry;
    }, function () {
      // If don't get the FileEntry (which may happen when testing
      // on some emulators), copy to a new FileEntry.
        return createNewFileEntry(imgUri);
    });
}

function createNewFileEntry(imgUri) {
    window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function success(dirEntry) {
        // JPEG file
        dirEntry.getFile("tempFile.jpeg", { create: true, exclusive: false }, function (fileEntry) {
        return fileEntry;
    }, onErrorCreateFile);
}, onErrorResolveUrl);

}

Примечание: не тестировалось...

person Baris Akar    schedule 24.01.2017