React-Native:如何打开本地捆绑的二进制文件
React-Native: How to open locally bundled binary file
我正在编写一个 react-native 应用程序,我希望它使用包含设备固件更新的 zip 文件进行部署。
在让用户发送更新之前,我需要我的代码来打开 zip 并对其内容进行一些验证。
我发现了很多压缩处理 NPM 包,所以我需要做的就是加载文件内容,这样我就可以将它提供给其中一个。
- require('./firmware/fw.zip'); <-- 打包器默认不包含 .zip
- require('./firmware/fw.pdf'); <-- [gross hack] 打包程序包括 pdf,但 require() 调用的实际结果是一个数字:
5
。我不知道我能用这个数字做什么来获取文件内容,但我很确定这个 require() 系统是为加载图像而不是二进制数据而设计的。
- ReactNativeFs.openFile('./firmware/fw.zip'); <-- 以 ENOENT
失败
- ReactNativeFs.openFile(
${ReactNativeFs.MainBundlePath}/firmware/fw.zip
); <-- MainBundlePath 在 android. 上是 undefined
这似乎是一个非常基本的问题,所以我确定我在某处遗漏了一段文档,但我已经进入第三个小时尝试加载此文件的内容,但没有成功。
我很确定我可以手动将 zip 文件放入适当的 android
和 ios
资源目录,但这似乎是一条难以维护的道路。
部分解决方案:
修改android/app/build.gradle,并添加
task copyData(type: Copy) {
from '../../firmware/fw.zip'
into 'src/main/assets/raw/firmware'
}
preBuild.dependsOn copyData
这将至少确保每次构建时都复制该文件,然后可用于 ReactNativeFs.readFileAssets('raw/firmware/fw.zip', 'base64')
。我并不 完全 激动,因为加载文件时我仍然需要 iOS/android 依赖代码,但至少它现在正在加载。
提示:注意 gradle 中的语法。 into src/main/assets/myFirmware.zip
将创建一个名为 myFirmware.zip 的目录,并将您的 zip 文件放在它下面。然后 readFileAssets 仍然会失败,因为它在您的路径中找到目录,而不是文件。
几个月后我再次遇到这个问题(我显然是唯一需要在 react-native 中打包 .zips 的人),上面的答案对 iOS 无效。所以我将 .zips 编码为 base64,将它们放入 .js 文件中,然后使用 import
从这些 .js 文件中获取数据。这实际上看起来像是一个有点老套但又灵活的长期解决方案,而不必弄乱与平台相关的文件位置。
查看我的新问题的完整答案:
我正在编写一个 react-native 应用程序,我希望它使用包含设备固件更新的 zip 文件进行部署。
在让用户发送更新之前,我需要我的代码来打开 zip 并对其内容进行一些验证。
我发现了很多压缩处理 NPM 包,所以我需要做的就是加载文件内容,这样我就可以将它提供给其中一个。
- require('./firmware/fw.zip'); <-- 打包器默认不包含 .zip
- require('./firmware/fw.pdf'); <-- [gross hack] 打包程序包括 pdf,但 require() 调用的实际结果是一个数字:
5
。我不知道我能用这个数字做什么来获取文件内容,但我很确定这个 require() 系统是为加载图像而不是二进制数据而设计的。 - ReactNativeFs.openFile('./firmware/fw.zip'); <-- 以 ENOENT 失败
- ReactNativeFs.openFile(
${ReactNativeFs.MainBundlePath}/firmware/fw.zip
); <-- MainBundlePath 在 android. 上是
undefined
这似乎是一个非常基本的问题,所以我确定我在某处遗漏了一段文档,但我已经进入第三个小时尝试加载此文件的内容,但没有成功。
我很确定我可以手动将 zip 文件放入适当的 android
和 ios
资源目录,但这似乎是一条难以维护的道路。
部分解决方案:
修改android/app/build.gradle,并添加
task copyData(type: Copy) {
from '../../firmware/fw.zip'
into 'src/main/assets/raw/firmware'
}
preBuild.dependsOn copyData
这将至少确保每次构建时都复制该文件,然后可用于 ReactNativeFs.readFileAssets('raw/firmware/fw.zip', 'base64')
。我并不 完全 激动,因为加载文件时我仍然需要 iOS/android 依赖代码,但至少它现在正在加载。
提示:注意 gradle 中的语法。 into src/main/assets/myFirmware.zip
将创建一个名为 myFirmware.zip 的目录,并将您的 zip 文件放在它下面。然后 readFileAssets 仍然会失败,因为它在您的路径中找到目录,而不是文件。
几个月后我再次遇到这个问题(我显然是唯一需要在 react-native 中打包 .zips 的人),上面的答案对 iOS 无效。所以我将 .zips 编码为 base64,将它们放入 .js 文件中,然后使用 import
从这些 .js 文件中获取数据。这实际上看起来像是一个有点老套但又灵活的长期解决方案,而不必弄乱与平台相关的文件位置。
查看我的新问题的完整答案: