如何使用expo FileSystem获取文件扩展名?

sin*_*bod 3 react-native expo

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

And*_*rew 5

使用图像选择器

如果您已请求许可并且能够从 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,
}
Run Code Online (Sandbox Code Playgroud)

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

let result = await ImagePicker.launchImageLibraryAsync({mediaTypes:'Images'});
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下方式访问 uriresult.uri

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

let uri = result.uri;
let fileExtension = uri.substr(uri.lastIndexOf('.') + 1);
Run Code Online (Sandbox Code Playgroud)

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

使用相机胶卷

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

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
Run Code Online (Sandbox Code Playgroud)

安卓

{
  node: {
    group_name: 0,
    image:  {
      height: 1280,
      playableDuration: 56,
      uri: "content://media/external/video/media/125",
      width: 720,
    },
    timestamp: 1541516873,
    type: "video/mp4",
  },
}
Run Code Online (Sandbox Code Playgroud)

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",
  },
}
Run Code Online (Sandbox Code Playgroud)

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