使用 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-fs
的copyFile
方法将内容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交互与数据传递