NOT_FOUND_ERR при попытке загрузить ионный файл в виде большого двоичного объекта с устройства Android

#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;"/>