Кордова/PhoneGap Открыть загруженный файл (InAppBrowser)

Используя Cordova/PhoneGap 3.3.0, я загружаю файл с помощью плагина FileTransfer, а затем пытаюсь открыть его с помощью плагина InAppBrowser. Я могу загрузить файл успешно и поместить его в каталог temp. Поскольку плагин File теперь использует схему URL, я не могу понять, как передать правильный URL-адрес методу window.open плагина InAppBrowser. Я также не могу найти соответствующую документацию. Вся документация "загрузить и открыть", которую я могу найти, устарела и пред-URL-схема.

Соответствующие ссылки:

Устаревшие примеры я нашел:

Вот мой код:

var uri = encodeURI("http://some.url/file.pdf");
window.requestFileSystem(LocalFileSystem.TEMPORARY, 0,
    function (fileSystem) {
        var fileTransfer = new FileTransfer();
        var filename = fileSystem.root.toURL() + uri.substr(uri.lastIndexOf("/") + 1);
        fileTransfer.download(uri, filename,
            function(entry) { // download success
                var path = entry.toURL(); //**THIS IS WHAT I NEED**
                window.open(path, "_system");
            },
            function(error) {} // irrelevant download error
        );
    },
    function(error) {} // irrelevant request fileSystem error
);

В настоящее время я тестирую Android на Nexus 7 и Nexus 5. InAppBrowser корректно открывает стандартный PDF-пуск (в моем случае Adobe Reader), но затем я получаю ошибку "Недопустимый путь к документу".

[Обновить: отображение возвращаемых значений]

Я пробовал все следующие комбинации для пути к файлу:

var path = entry.toURL(); // "cdvfile://localhost/temporary/file.pdf"
var path = entry.fullPath; // "file.pdf"
var path = fileSystem.root.toURL() + filename; // "cdvfile://localhost/temporary/file.pdf"
var path = fileSystem.root.fullPath + filename; // "/file.pdf"

Ответ 1

Я ДУМАЮ, У меня есть решение этого, но это отвратительно.

Я прошел через кордову JAVA и искал места, где он создал объект JSON для записи файла. В частности, ищите места, где добавляется fullPath к объекту.

Я добавил дополнительную запись для "fullAbsolutePath" со значением [file].getAbsolutePath(), где [file] - это какой-либо экземпляр java.io.file. Я сделал это во всех местах, где я мог найти, чтобы быть в безопасности, и потому что это нисколько не повредит.

Затем я модифицировал FileEntry.js и File.js в папке plugins\file, чтобы также заполнить это значение для объекта записи файла.

По-прежнему пытаюсь выработать перегибы, но я считаю, что я на правильном пути...

Я думаю, что лучшим решением было бы изменить плагин inAppBrowser, чтобы распознать и разрешить протокол cordovaFile://, и я уверен, что они скрывали абсолютный путь к файловой системе специально, но это может быть немного выше меня.

ИЗМЕНИТЬ - Yup! это работает! Теперь я могу взять запись в файле, вызвать метод файла, а затем прочитать файл fullSystemPath с объекта fileObject. Значение похоже на "/storage/emulated/0/whatever/" на моем андроиде. Просто нужно добавить "файл://", и window.open примет его.

Ответ 2

Так как Cordova 3.4 изменился файловый протокол, и вместо использования fullPath теперь они предоставляют toURL(), который возвращает путь cdvfile://path/to/your/file.ext.

Поэтому, когда вы загружаете файл, используя обратный вызов объекта файловой системы (с аргументом записи), просто вызывайте entry.toURL() и открывайте его, используя следующую инструкцию, чтобы открыть его - если у вас установлен InApBrowser, а _blank откроет Окно InAppBrowser:

window.open(entry.toURL(), '_blank', 'location=no,closebuttoncaption=Close,enableViewportScale=yes');  

Я написал об этом в этом сообщении в своем блоге (если вам нужны все ссылки и справочная информация).

Ответ 3

В последние кордовые документы говорят

Если вы обновляете новую (1.0.0 или более новую) версию файла и вы ранее использовали entry.fullPath в качестве аргументов для загрузить() или загрузить(), то вам нужно будет изменить свой код для использования вместо URL-адресов файловой системы.

FileEntry.toURL() и DirectoryEntry.toURL() возвращают URL-адрес файловой системы вида

cdvfile://localhost/persistent/path/to/file, который можно использовать на месте абсолютного пути к файлу в методах download() и upload().

Что вы можете попробовать, удалите cdvfile://localhost/persistent, чтобы иметь URL-адрес, который будет работать с вашим window.open. (возможно, начните с оповещения или console.log о том, что вы получаете с помощью entry.toURL())

Ответ 4

В текущей ветке dev плагина есть решение:

Entry.toNativeURL() - возвращает полный путь к файлу в файловой системе устройства.

https://github.com/apache/cordova-plugin-file/tree/dev

Ответ 5

Я знаю, что это уже ответили, но я имел наибольший успех с entry.toInternalURL().

Ответ 6

Путь, следующий за "cdvfile://localhost/persistent", похож на путь корневого приложения (www folder). Другими словами, я имею в виду, что у вас есть доступ к изображениям или загруженным файлам, используя путь, следующий за "cdvfile://localhost/persistent".

Пример

Загрузить целевой путь: "cdvfile://localhost/persistent/MyImages/thebestimageever.jpg"

В теге изображений HTML я мог бы сделать это: <img src="/MyImages/thebestimageever.jpg" />

И он работает хорошо.

Ответ 7

Просто напишите window.open в методе загрузки или попросите файловую систему и запись снова, прежде чем открывать, если вы хотите сделать это отдельно

function downloadFile(fileURL, destination, fileName) {
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
    fileSystem.root.getDirectory(destination, {
        create: true
    }, function (dirEntry) {
        var ft = new FileTransfer();
        ft.download(fileURL, dirEntry.toURL() + "/fileName", function (entry) {
            alert(fileName + " downloaded successfully at:" + dirEntry.fullPath);
            window.open(dirEntry.toURL() + "fileName", "_blank", "location=yes");
        }, function (error) {
            alert("download failed: " + JSON.stringify(error));
        });
    }, function (error) {
        alert("dir creation failed: " + JSON.stringify(error));
    });
}, function (error) {
    alert("requesting file system failed: " + JSON.stringify(error));
});

}

если ваш пункт назначения имеет более одного уровня папки, тогда вы должны попросить getDirectory рекурсивно один за другим (если ваши папки уже созданы, то один вызов метода достаточно)

PS: - на iOS файлы загружаются в папку "Документы", а не на "www", а не на то же местоположение вашего содержимого app.js, как говорят некоторые люди   - если вы открываете html-страницу с js и css из загруженной распакованной папки, тогда вам нужно внести некоторые изменения на InAppBrowser.m, чтобы обеспечить правильную загрузку