React native 如何在React Native(Expo)中散列图像数据? 我的意图:

React native 如何在React Native(Expo)中散列图像数据? 我的意图:,react-native,expo,React Native,Expo,我希望我的应用程序将图像上传到S3。若映像已经存在,服务器应该记录对现有映像的引用,而不是要求上传另一个副本 我想这是怎么回事: 散列图像数据 向服务器发送哈希,请求签名url(上传到AWS S3) 若散列匹配已存储的内容,请引用它并告诉应用程序 初步想法: 使用imageEditor.cropImage将图像导入,这将为我提供一个合适的uri。然后使用getBase64ForTag(uri,success,failure)检索base64数据以进行哈希计算 问题是: 根据对此的回答,这个过程一

我希望我的应用程序将图像上传到S3。若映像已经存在,服务器应该记录对现有映像的引用,而不是要求上传另一个副本

我想这是怎么回事:
  • 散列图像数据
  • 向服务器发送哈希,请求签名url(上传到AWS S3)
  • 若散列匹配已存储的内容,请引用它并告诉应用程序
  • 初步想法: 使用
    imageEditor.cropImage
    将图像导入,这将为我提供一个合适的uri。然后使用
    getBase64ForTag(uri,success,failure)
    检索base64数据以进行哈希计算

    问题是: 根据对此的回答,这个过程一点也不高效。通常的解决方案是使用本机方法,如回答中所述,但是我不想为此功能弹出我的Expo应用程序

    我的问题: 有没有更好的方法来散列图像数据?或者更重要的是,是否有更好的方法确保相同的图像不会在S3存储中复制?

    编辑2020-10-21:

    库本身已更新,现在您应该调用:

    _hashImage = async (imageUri) => {
        return await FileSystem.getInfoAsync(imageUri, { md5: true } );
    }
    

    原件:

    事实证明,世博会提供了这种开箱即用的服务


    如果您仍在寻找解决方案:

    这就是我如何让它工作的——创建图像的base64,然后创建它的散列

    import * as FileSystem from 'expo-file-system';
    import * as Crypto from 'expo-crypto';
    
    let info = await FileSystem.readAsStringAsync(imageUri, 
       { encoding: FileSystem.EncodingType.Base64 });
    
    const hashData = await Crypto.digestStringAsync (
        Crypto.CryptoDigestAlgorithm.MD5,
        info
     )
    

    我正在使用它并得到
    [未处理的承诺拒绝:错误:调用带有参数
    (]
    。知道为什么吗?我能想象出的唯一错误可能是一个不正确的imageUri。你从哪里获取Uri?我从我的ios设备的本地存储中获取Uri。无论如何,我是通过将其转换为base64然后创建一个哈希来实现这一点的。这是我尝试的第一种方法。不幸的是,这非常昂贵通过JS本机网桥获取Base64数据。我无法想象这在过去两年中会发生什么变化。我也尝试过这样做,但这个过程生成的哈希与Mac返回的哈希不一样?你知道这可能会发生吗?@TanyaSah这取决于编码。如果使用不同的编码将字符串映射到字节序列然后,相同的输入将给您两个不同的哈希值。@阿披舍克不包括文件元数据以及用于计算哈希值的元数据。是否可以仅使用图像数据而不使用任何元数据来获取哈希值?
    import * as FileSystem from 'expo-file-system';
    import * as Crypto from 'expo-crypto';
    
    let info = await FileSystem.readAsStringAsync(imageUri, 
       { encoding: FileSystem.EncodingType.Base64 });
    
    const hashData = await Crypto.digestStringAsync (
        Crypto.CryptoDigestAlgorithm.MD5,
        info
     )