1

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

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

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

4

3 回答 3

15

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 没有名为MainBundlePath仅在iOS. 我花了一些时间研究和查看设备上的不同文件夹,但我无法访问捆绑的图像。似乎它们无法以我们希望使用的方式访问react-native-fs

可能的解决方案

rn-fetch-blob

rn-fetch-blob具有两种功能iosAndroid可以从资产目录中读取

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

将文件存储在本机项目中

而不是依赖捆绑器为您打包图像并将它们放在设备上。您可以将它们的副本存储在iOSAndroid项目中。这样做的好处是图像可以在开发中使用,但是您将多次存储图像,这可能会导致更大的应用程序大小。

将图像存储为 base64

您可以将图像作为 base64 字符串存储在 json 文件中,然后您的应用程序需要这些。这将意味着您已经将它们放在 base64 中(因此应用程序不必进行任何转换),但您将再次增加应用程序的大小。如果只有少量图像,它可能是最简单的选择。

于 2019-02-08T14:53:20.150 回答
0

使用 RNFS 的 2021 年更新

iOS

安德鲁的使用建议RNFS.MainBundlePath仍然有效。

安卓

RNFS 可以通过以下方式读取应用资产目录中的文件:

RNFS.readFileAssets(filepath:string, encoding?: string)

编码可以是 utf8(默认)、ascii 或 base64 之一。使用 base64 读取二进制文件。filepath是从 assets 文件夹的根目录到文件的相对路径。

例如,如果您的文件直接在您的资产目录中:

RNFS.readFileAssets('coolimage.png', 'base64');

https://github.com/itinance/react-native-fs#readfileassetsfilepathstring-encoding-string-promisestring

于 2021-10-22T01:56:10.410 回答
-1

只需使用 filename = response.uri.replace('file:', '')

最终代码:

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

现在工作...

于 2019-07-08T09:11:25.620 回答