使用 React-Native 将 content:// URI 转换为 Android 的实际路径

Posted

技术标签:

【中文标题】使用 React-Native 将 content:// URI 转换为 Android 的实际路径【英文标题】:Convert content:// URI to actual path for Android using React-Native 【发布时间】:2016-03-28 09:19:49 【问题描述】:

我正在尝试从cameraRoll 上传图片。事情是 cameraRoll 组件返回 content:// URI 而不是实际的文件路径。为了上传图片我需要一个文件路径,有没有办法将 content:// URI 转换为文件 URI?谢谢

【问题讨论】:

为什么需要路径?例如,您不能使用InputStream 吗? 我正在开发一个 React-Native 应用程序,使用 Java 方法有点麻烦,所以我正在寻找一个 React Native 解决方案。谢谢 【参考方案1】:

我把@Madhukar Hebbar提交的函数拿来做成了一个React Native Node Module。

你可以在这里找到它:react-native-get-real-path

从而实现你想要的,可以结合react-native-fs使用上面的模块

当您想从相机胶卷上传所选图像时,您可以执行以下操作:

RNGRP.getRealPathFromURI(this.state.selectedImageUri).then(path =>
  RNFS.readFile(path, 'base64').then(imageBase64 =>
    this.props.actions.sendImageAsBase64(imageBase64)
  )
)

【讨论】:

你是救世主!只有一个问题 - 因为它仅适用于 android - 需要将 require 包行放在平台检查逻辑中。但是与它提供的实用程序相比 - 我可以忽略这一点。 :-) 我使用了你的库,但没有用。我收到undefined is not a function(reactNativeGetRealPath2.default.getRealPathFromUri(path)) 的错误,我给出的路径是content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F890/ORIGINAL/NONE/225703422 有没有同时支持ios和android的库【参考方案2】:

您可以使用react-native-fscopyFile方法将内容uri转换为文件uri。

if (url.startsWith('content://')) 
    const urlComponents = url.split('/')
    const fileNameAndExtension = urlComponents[urlComponents.length - 1]
    const destPath = `$RNFS.TemporaryDirectoryPath/$fileNameAndExtension`
    await RNFS.copyFile(url, destPath)

那么你就可以按预期使用'file://' + destPath

【讨论】:

请注意: 1. 代码中有几个变量名错误。 2. 如果您的文件名中有“%”符号,则不会上传。所以,替换这些字符。【参考方案3】:

content:// URI传递给下面的方法,以字符串形式获取文件路径,然后使用文件对象进行任何操作。

File file = new File(getURIPath(uriValue));

/**
 * URI Value
 * @return File Path.
 */
String getURIPath(Uri uriValue) 
    
        String[] mediaStoreProjection =  MediaStore.Images.Media.DATA ;
        Cursor cursor = getContentResolver().query(uriValue, mediaStoreProjection, null, null, null);
        if (cursor != null) 
        int colIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String colIndexString=cursor.getString(colIndex);
        cursor.close();
        return colIndexString;
        
        return null;
    

【讨论】:

如何更改此功能以处理所有文件类型,如文档和视频文件?

以上是关于使用 React-Native 将 content:// URI 转换为 Android 的实际路径的主要内容,如果未能解决你的问题,请参考以下文章

《React-Native系列》RN与native交互与数据传递

react-native 沉浸式状态栏

react-native init AwesomeProject 无法连接到 github.com

react-native 调用原生方法

多部分/表单数据请求在 react-native 中失败

将 FabricJS 与 React-Native 一起使用