代码之家  ›  专栏  ›  技术社区  ›  rendom

react native fs:如何读取本地映像(获取本地文件的base64)

  •  0
  • rendom  · 技术社区  · 5 年前

    我的应用程序中有本地文件,如下所示:

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

    如何使用读取此文件 RNFS.readFile(filepath, "base64"); 使用 RNFS.readFile("../../img/pic1.jpg", "base64"); 给我错误“没有这样的文件”

    1 回复  |  直到 5 年前
        1
  •  1
  •   Andrew    5 年前

    react-native-fs 将仅从设备存储访问文件。所以这个问题造成了一个困惑。这些文件在构建时捆绑在一起,所以我们如何在开发与生产中访问它们?

    我的项目结构

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

    我把我的图像存储在里面 ./app/assets/images/

    发展

    在什么时候 发展 调试 这些文件通过Metro Bundler提供给设备,因此它们实际上不存储在设备上。因此,从设备存储中访问它们是不可能的。你得提供一些 嘲弄的 用于开发时的功能。可以使用 __DEV__ 允许根据环境运行不同的函数 https://facebook.github.io/react-native/docs/javascript-environment

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

    生产

    从一些研究来看,似乎可以访问生产中的文件。

    网间网操作系统

    我发现文件位于一个名为 assets 那是在 MainBundlePath .

    所以如果你想访问我本地目录中的以下文件 ./app/assets/images/image.png 您需要以下文件路径: RNFS.MainBundlePath + /assets/app/assets/images/image.png 在设备上访问它。

    您可以通过查看 Packaging.log 是用你的 ipa .

    安卓

    Android没有名为 主束路径 那只是在 iOS . 我花了一些时间研究和查看设备上的不同文件夹,但无法访问捆绑的图像。它们似乎无法以我们希望使用的方式访问 反应本地FS .

    可能的解决方案

    rn-fetch-blob

    RN取出块 两者都有功能 ios Android 从资产目录中读取

    访问的文件 网间网操作系统 您可以这样做:

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

    为了 安卓 您可以这样做:

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

    它确实对Gradle压缩的资产发出了警告。

    Gradle将默认压缩捆绑资产。要使用此模块与资产文件交互,必须禁用压缩。请看 How to access files from assets 更多细节。

    这可以解释为什么当我使用 反应本地FS

    您可以阅读更多关于使用 RN取出块 它的文件系统在这里 https://github.com/joltup/rn-fetch-blob#user-content-file-system

    将文件存储在本机项目中

    而不是依靠bundler为您打包图像并将其放到设备上。您可以将它们的副本存储在 网间网操作系统 安卓 项目。这样做的好处是,这些图像在开发中是可用的,但是您将多次存储这些图像,这可能会导致更大的应用程序大小。

    将图像存储为base64

    您可以将图像存储为JSON文件中的base64字符串,然后应用程序需要这些字符串。这就意味着你已经在base64中使用了它们(这样应用程序就不需要进行任何转换),但是你又会增加应用程序的大小。如果它只是一小部分图像,那么它可能是最简单的选项。