Я пытаюсь прочитать содержимое файла, расположенного в /storage/emulated/0/...
, используя cordova-plugin-file . Я могу получить связанный FileEntry
и прочитать некоторые свойства, такие как имя, тип или размер, но когда я использую FileReader
для чтения содержимого, происходит сбой с FileError {code: 1}
FileError - API утверждает, что код ошибки 1 - NOT_FOUND_ERR
, но я уверен, что файл существует. Как я уже сказал, я могу получить его размер (я проверил, что значение верное!).
Я использую следующий код для проверки:
window.resolveLocalFileSystemURL(
"cdvfile://localhost/sdcard/ticket/fake.pdf",
function(fileEntry) {
console.log("ENTRY URL " + fileEntry.toURL());
console.log("IS FILE: " + fileEntry.isFile);
fileEntry.file(function(file){
console.log("FILE: " + file.name);
console.log("SIZE: " + file.size);
console.log("TYPE: " + file.type);
var reader = new FileReader();
reader.onloadend = function() {
console.log("READER END");
console.log(this.result);
};
reader.onerror = function(er) {
console.log("READER ERROR");
console.log(er);
};
reader.readAsDataURL(file);
}, console.error);
},
console.error
);
вывод is:
ENTRY URL file:///storage/emulated/0/ticket/fake.pdf
IS FILE: true
FILE: fake.pdf
SIZE: 32471
TYPE: application/pdf
READER ERROR
ProgressEvent {type: "error", bubbles: false, cancelBubble: false, cancelable: false, lengthComputable: false, …}
READER END
где: ProgressEvent.target
равно FileReader
и ProgressEvent.target._error
равно FileError {code: 1}
Я также пробовал использовать другие пути или файлы:
AndroidManifest. xml имеет:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Ответы на другие похожие вопросы, которые я нашел, предлагают в качестве решения то, что я уже делаю.
ОБНОВЛЕНИЕ:
Это Кажется, проблема с разрешениями. Если я сделаю
window.resolveLocalFileSystemURL("cdvfile://localhost/sdcard/ticket/fake.pdf", okFunction, errorHandler);
, это не вызовет запрос разрешения для пользователя. Но это происходит с:
window.resolveLocalFileSystemURL("cdvfile://localhost/sdcard/ticket/fake.pdf", function(f) {
f.filesystem.root.getFile(f.fullPath, {}, okFunction, errorHandler)
}, errorHandler);
Как только пользователь принимает разрешение, все методы работают нормально.
Теперь мой вопрос, почему, если я использую FileEntry
из window.resolveLocalFileSystemURL
для чтения контент, который не запрашивает разрешение, но делает для FileEntry
из filesystem.root.getFile
.