React-native,如何获取文件资产图像的绝对路径?

时间:2018-06-18 12:20:01

标签: ios react-native

我正在使用react-native对ios进行一些图像处理。

问题是我使用的库之一只支持绝对路径,但我只有文件资产uri。

实施例

我有:

assets-library://asset/asset.HEIC?id=CE542E92-B1FF-42DC-BD89-D61BB70EB4BF&ext=HEIC

我需要:

file:///Users/USERNAME/Library/Developer/CoreSimulator/Devices/########-####-####-####-############/data/Containers/Data/Application/########-####-####-####-############/Documents/########-####-####-####-############.jpg

有没有办法轻松获得图像绝对路径?

4 个答案:

答案 0 :(得分:1)

最后,我没有找到一种很好的方法。

我最终使用react-native-fs copyAssetsFileIOS将文件复制到应用程序沙盒文档目录,这给了我一个绝对路径目录。

希望对您有所帮助。

答案 1 :(得分:1)

根据@ospfranco的回答,这就是我最终要做的。 我将资产的副本保存在temp文件夹中。还包括一个小片段,用于为文件名生成随机字符串。

import RNFS from 'react-native-fs';

getAssetFileAbsolutePath = async (assetPath) => {
    const dest = `${RNFS.TemporaryDirectoryPath}${Math.random().toString(36).substring(7)}.jpg`;

    try {
      let absolutePath = await RNFS.copyAssetsFileIOS(assetPath, dest, 0, 0);
      console.log(absolutePath)
    } catch(err) {
      console.log(err)
    } 
  }

答案 2 :(得分:1)

我使用 RNFS 让它工作,但我必须在 uri 路径中添加一些“额外”才能让它工作。

<TouchableHighlight
          onPress={async () => {
            const destPath = RNFS.CachesDirectoryPath + '/MyPic.jpg';

            try {
              await RNFS.copyAssetsFileIOS(imageUri, destPath, 0, 0);
              console.log('destPath', destPath);
            } catch (error) {
              console.log(error);
            }

            navigation.navigate('SelectedPicture', {
              uri: 'file://' + destPath,
            });
          }}>
          <Image source={{uri: imageUri}} style={styles.image} />
        </TouchableHighlight>

答案 3 :(得分:0)

这个问题很老,但是我回答这个问题是为了帮助像我这样的人,在本机反应方面是新手,也遇到同样的问题。 我一直在努力尝试从相机胶卷中获取图像并使用OCR库对其进行处理。我使用react-native-photo-framework来获取图像,发现使用资产的方法getImageMetadata可以获取 fileurl 。我需要此fileurl,因为原始URI的格式为'photo:// ...'未被识别为OCR库的有效URL。我尚未在真实设备和iCloud资产上进行过测试。示例:

const statusObj = await RNPhotosFramework.requestAuthorization()
if (statusObj.isAuthorized) {
    const assetList = await RNPhotosFramework.getAssets({
      includeMetadata: true,
      includeResourcesMetadata: true,
      fetchOptions: {
        mediaTypes: ['image'],
        sourceTypes: ['userLibrary', 'cloudShared', 'itunesSynced'],
      }
    })
    const asset = photos.assets[0]
    const metadata = await asset.getImageMetadata()
    const uri = metadata.imageMetadata.fileUrl
}