Reaction-native-fs: Как читать локальные изображения (Получить base64 локального файла) - PullRequest
0 голосов
/ 07 февраля 2019

В моем приложении есть локальные файлы, которые я читаю так:

<Image source={require("../../img/pic1.jpg") />

Как читать этот файл, используя RNFS.readFile(filepath, "base64");, используя RNFS.readFile("../../img/pic1.jpg", "base64");, выдает ошибку "нет такогофайл "

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Просто используя имя файла = response.uri.replace ('file:', '')

Окончательный код:

if (Platform.OS === 'ios') {
      filename = response.uri.replace('file:', '')
} else {
      filename = response.uri
}

Работает сейчас ...

0 голосов
/ 08 февраля 2019

react-native-fs будет обращаться только к файлам из хранилища устройства.Так что эта проблема ставит в тупик.Эти файлы связаны во время сборки, так как мы можем получить к ним доступ в процессе разработки или производства?

Структура моего проекта

├── android
├── app
│   └── assets
│       └── images
└── ios

Я храню свои изображения внутри ./app/assets/images/

Разработка

В Разработка или отладка файлы передаются на устройство через Metro-пакет, поэтому они фактически не сохраняются на устройстве.Таким образом, доступ к ним из хранилища устройств будет невозможен.Вы должны были бы предоставить какую-то смоделированную функциональность для разработки.Можно использовать __DEV__, чтобы разрешить запуск различных функций в зависимости от среды https://facebook.github.io/react-native/docs/javascript-environment

if (__DEV__) {
  // do something in development
} else {
  // do something in production
}

Производство

Из некоторых исследований кажется, что возможно получить доступ кфайлы в производстве.

iOS

Я обнаружил, что файлы находятся в папке с именем assets, которая находится в MainBundlePath.

Поэтому, если вы хотите получить доступ к следующему файлу в моем локальном каталоге ./app/assets/images/image.png, вам потребуется следующий путь к файлу: RNFS.MainBundlePath + /assets/app/assets/images/image.png для доступа к нему на устройстве.

Вы можете проверить путь к файлу, посмотрев на Packaging.log, сгенерированный вашим ipa.

Android

В Android нет папки с именем MainBundlePath, которая находится только на iOS.Я провел некоторое время, исследуя и просматривая различные папки на устройстве, но не смог получить доступ к изображениям, которые в комплекте.Казалось бы, они не доступны так, как мы надеемся, используя react-native-fs.

Возможные решения

rn-fetch-blob

rn-fetch-blob имеет функциональность для обоих ios и Android для чтения из каталога ресурсов

Чтобы получить доступ к файлам для iOS, вы должны сделать что-то вроде этого:

RNFetchBlob.fs.stat(fs.dirs.MainBundleDir + '/whatever/files/you/added.mp3').then( stats => {...});

И для Android вы бы сделаличто-то вроде этого:

RNFetchBlob.fs.stat(fs.asset('/whatever/files/you/added.mp3').then( stats => {...});

Это предупреждает о сжатии ресурсов Gradle.

Gradle по умолчанию сжимает связанные активы.Для взаимодействия с файлами ресурсов с этим модулем сжатие должно быть отключено.См. Как получить доступ к файлам из ресурсов для получения более подробной информации.

Это может объяснить, почему я не смог найти какие-либо активы в Android при поиске с помощью react-native-fs

Подробнее об использовании rn-fetch-blob и его файловой системе можно прочитать здесь https://github.com/joltup/rn-fetch-blob#user-content-file-system

Хранение файлов в собственных проектах

Вместо того, чтобы полагаться на упаковщик для упаковки изображений для васи положить их на устройство.Вы можете хранить их копии уже в проектах iOS и Android.Это дает преимущество в том, что изображения будут доступны в процессе разработки, однако вы сохраняете изображения несколько раз, и это может привести к увеличению размеров приложения.

Хранение изображений в формате base64

Вы можете сохранить изображения в виде строк base64 в файлах json, а затем запрашивать их в своем приложении.Это будет означать, что они будут уже в base64 (поэтому приложение не должно выполнять никаких преобразований), но вы снова увеличите размер своего приложения.Если это только небольшое количество изображений, это может быть самый простой вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...