【问题标题】:How to get file extension with expo FileSystem?如何使用 expo FileSystem 获取文件扩展名?
【发布时间】:2019-06-17 23:11:00
【问题描述】:

我正在使用 expo FileSystem 从 cameraRoll 获取照片和视频。有没有办法获得这些文件扩展名?

【问题讨论】:

    标签: react-native expo


    【解决方案1】:

    使用 ImagePicker

    如果您已请求许可并且能够从 ImagePicker 获得响应,您应该会得到一个如下所示的对象。

    {
      "cancelled": false,
      "height": 2436,
      "type": "image",
      "uri": "file:///lots/of/directories/where/the/image/is/stored/ImagePicker/B69EA641-4738-4425-8319-FE190FC4BD6D.png",
      "width": 1125,
    }
    

    如果你像这样调用 ImagePicker(记住这是一个 await,所以它应该被包裹在一个 try/catch 中)

    let result = await ImagePicker.launchImageLibraryAsync({mediaTypes:'Images'});
    

    然后您可以使用 result.uri 访问 uri

    所以我们可以做这样的事情

    let uri = result.uri;
    let fileExtension = uri.substr(uri.lastIndexOf('.') + 1);
    

    请记住,用户可以取消请求,因此您应该在尝试获取文件扩展名之前检查 result.cancelled 是否为 false,否则您将遇到问题,因为 uri 不存在。

    使用 CameraRoll

    使用相机胶卷的反应在不同平台上不一致。以下代码将访问设备上的第一个视频。

    let params = { first: 1, assetType: CameraRoll.AssetTypeOptions.Videos }; 
    let result = await CameraRoll.getPhotos(params)
    let videos = result.edges // the edges key stores an array of objects
    

    安卓

    {
      node: {
        group_name: 0,
        image:  {
          height: 1280,
          playableDuration: 56,
          uri: "content://media/external/video/media/125",
          width: 720,
        },
        timestamp: 1541516873,
        type: "video/mp4",
      },
    }
    

    iOS

    {
      node:  {
        group_name: "Camera Roll",
        image:  {
          filename: "IMG_5030.MOV",
          height: 1080,
          isStored: true,
          playableDuration: 612,
          uri: "assets-library://asset/asset.MOV?id=10711D3D-EBDC-4EF2-A849-411D593A0B15&ext=MOV",
          width: 1920,
        },
        location:  {
          altitude: 0,
          heading: -1,
          latitude: 0.0,
          longitude: 0.0,
          speed: -1,
        },
        timestamp: 1544786625,
        type: "ALAssetTypeVideo",
      },
    }
    

    如您所见,Android 没有给出具体的filename,与iOS 不同。对于iOS,您可以使用我上面描述的方法提取文件扩展名。不幸的是,对于Android,获取实际文件扩展名的唯一方法是使用ImagePicker

    【讨论】:

    • 感谢您的回复,但我使用过这样的 CameraRoll:let params = { first: 21, assetType: CameraRoll.AssetTypeOptions.Videos }; CameraRoll.getPhotos(params) 我想实现类似 instagram 添加帖子的功能。但似乎在android中没有什么比在cameraRoll api中包含文件扩展名
    • 是的,这就是我使用 ImagePicker 进行解释的原因。 CameraRoll 在 Android 上返回的内容有点有限。我已经更新了我的答案,以包含 iOS 和 Android 响应之间的差异。
    猜你喜欢
    • 2010-09-16
    • 2014-04-14
    • 2012-07-23
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多