#javascript #android #ionic-framework #ionic-native
#javascript #Android #ионный каркас #ионный-родной
Вопрос:
Я получаю некоторое FileError {code: 1}
время, пытаясь загрузить файл с моего Android-устройства с помощью cordova-plugin-file
. Мой код:
import { File } from '@ionic-native/file/ngx';
...
private loadGpkgBlob(): Promise<any> {
const gpkgPath = this.file.externalRootDirectory "test_dir/test.gpkg";
return new Promise((resolve, reject) => {
return this.file.resolveLocalFilesystemUrl(gpkgPath).then((fileEntry: any) => {
fileEntry.file(gpkgFile => {
// file is present (see screenshot 1)
console.log("gpkgFile: ", gpkgFile);
const reader = new FileReader();
reader.onloadend = function (e) {
const blob = new Blob([reader.result], { type: 'application/geopackage sqlite3' });
// blob with size 4 (see screenshot 2)
console.log("result: ", blob);
resolve(blob);
};
reader.onerror = function (e) {
// FileError {code: 1} -> NOT_FOUND_ERR (https://developer.mozilla.org/en-US/docs/Web/API/FileError)
console.log("error: ", reader.error);
};
reader.readAsArrayBuffer(gpkgFile);
});
}).catch(e => e => console.log(e));
});
}
Снимок экрана 1 — файл на устройстве:
Скриншот 2 — gpkg-blob:
Файл, очевидно, найден. Есть какие-нибудь предложения о том, как это исправить / отладить?
Ответ №1:
Вы получаете эту ошибку из-за того, что плагин file не может разрешить путь, который вы указали.
итак, в основном вам нужно использовать еще один плагин FilePath
, который может разрешить этот путь и предоставит вам новый путь, который может быть разрешен с помощью плагина file.
const nativeFilePath = await this.filepath.resolveNativePath(gpkgPath);
return this.file.resolveLocalFilesystemUrl(nativeFilePath).then((fileEntry: any) => {
Я упомянул URL-адрес этого плагина пути к файлу ниже. После этого изменения он будет работать на вас 🙂
https://ionicframework.com/docs/native/file-path
Если вы не хотите делать это с помощью async, вы можете использовать его, как указано ниже
this.filePath.resolveNativePath(gpkgPath)
.then(nativeFilePath => {
return this.file.resolveLocalFilesystemUrl(nativeFilePath).then((fileEntry: any) => {
//// your rest code
})
.catch(err => console.log(err));
пожалуйста, проверьте скриншот ниже, как он работает для меня
Комментарии:
1. Путь к файлу, похоже, не помогает: nativeFilePath — это «file:///storage/emulated/0/test_dir/test.gpkg». Геопакет localURL не меняется (должно ли это быть?).
2. Путь к файлу поможет вам здесь. я настроил все на своем локальном компьютере и попробовал .. раньше у меня это тоже не работало, но после этого изменения оно начало работать.. пожалуйста, дайте ему попробовать
3. возможно, я ошибаюсь в том, что касается пути, я действительно зашел намного глубже, но могу поспорить, что это сработает для вас после этого шанега
4. в плагине пути к файлу они четко указали, что этот плагин позволит вам
resolve the native filesystem path for Android
5. Я все еще получаю тот же результат… Необходима ли какая-то специальная конфигурация? Я прочитал о различных политиках безопасности и добавил это в свой index.html:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' http://localhost:8100 'unsafe-inline' 'unsafe-eval' data: cdvfile://* file://* content://* gap: https://ssl.gstatic.com;"/>