在React Native上的Android平台,如何读取包含内容URI的文件?

15

我正在使用React Native (0.48.3)进行Android开发。似乎我卡在了一个非常琐碎的任务上:选择一个文件并将其内容读取为字符串。我有react-native-document-picker v2.0.0用于文件选择,它可以正常工作:我可以选择文件并获取其URI。问题是,我不能使用这个链接来读取文件。我已经尝试过react-native-filesystemreact-native-fs,但似乎它们只能处理应用程序目录中的文件。无论如何,我都会收到以下错误:

Error: File was not found: content://com.android.providers.downloads.documents/document/7

我需要使用哪个软件包或函数?

更新:使用react-native-get-real-path检索真实的非content://路径使事情正常运行。但是这种转换真的有必要吗?能否使用content://路径加载文件?

4个回答

5
假设你正在使用react-native-fs,使用copyFile可以将内容URI转换为文件URI。
if (url.startsWith('content://')) {
    const uriComponents = url.split('/')
    const fileNameAndExtension = urlComponents[uriComponents.length - 1]
    const destPath = `${RNFS.TemporaryDirectoryPath}/${fileNameAndExtension}`
    await RNFS.copyFile(uri, destPath)
}

然后您可以像预期的那样使用'file://' + destPath


多么珍贵的答案! - Yusuf
1
什么是urlComponents? - FabioDev
const destPath = ${RNFS.TemporaryDirectoryPath}/${fileNameAndExtension}.replace(/%/g, "") - cagri

2

react-native-fs中已经合并了一个拉取请求#395,它添加了直接从以content://开头的URI读取的可能性。我在这段代码中使用Android URI没有任何问题:


DocumentPicker.show({ filetype: ['*/*'] }, async (error, res) => {
  ...
  const exportedFileContent = await fs.readFile(res.uri, 'base64')
  ...
})

0
在安卓设备上,你需要在文件路径前加上 "file://" 才能加载任何文件。你可以使用你提到的包或者手动添加。如果你手动添加,react-native-fs 库就可以用来读取 URI。

0

现在是2023年,如果有人仍需要帮助,可以尝试使用react-native-blob-util包。

我在使用react-native-document-picker选择文件时遇到了问题。帮助我的是使用RNBU.fs.readStream()函数。我首先使用它将文件转换为base64,然后使用react-native-fs的RNFS.writeFile()函数将文件保存到我的设备目录中。React Native Blob util希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接