Кордова/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, чтобы обеспечить правильную загрузку