You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用Expo.DocumentPicker.getDocumentAsync?多MIME类型筛选失败求助

解决Expo SDK27中DocumentPicker多MIME类型筛选问题

我来帮你搞定这个在Expo SDK27里遇到的文件类型筛选难题!首先得明确一个关键信息:Expo SDK27的DocumentPicker.getDocumentAsync API还不支持传入数组作为type参数,所以你用["image/*","application/pdf"]会导致程序崩溃是完全正常的——数组写法是后续更高版本SDK才新增的特性。

针对SDK27,你需要用字符串格式指定多类型,但要注意iOS和Android的平台差异:

1. 分平台的正确写法

Android平台

可以直接用分号分隔多个MIME类型,写法如下:

const result = await Expo.DocumentPicker.getDocumentAsync({
  type: "image/*;application/pdf"
});

iOS平台

iOS对文件类型的识别更偏向于Apple的UTI(Uniform Type Identifier),如果上面的MIME写法不生效,可以尝试用UTI标识符:

const result = await Expo.DocumentPicker.getDocumentAsync({
  type: "public.image,public.pdf"
});

2. 兜底方案:手动校验文件类型

如果上面的平台特定写法还是无法满足需求,或者遇到兼容性问题,可以先允许选择所有类型,然后在获取结果后手动校验MIME类型:

const result = await Expo.DocumentPicker.getDocumentAsync({
  type: "*/*" // 先允许选择所有文件
});

if (result.type === "success") {
  // 定义允许的MIME类型列表
  const allowedMimeTypes = ["image/jpeg", "image/png", "image/gif", "application/pdf"];
  if (!allowedMimeTypes.includes(result.mimeType)) {
    alert("请选择图片或PDF格式的文件");
    // 这里可以添加错误处理逻辑,比如提示用户重新选择
    return;
  }
  // 校验通过,处理选中的文件
  console.log("选中的有效文件:", result);
}

额外建议

SDK27是比较老旧的版本了,如果你有升级的空间,建议升级到更高版本的Expo SDK(比如SDK30+),后续版本已经支持直接传入数组形式的type参数,写法更简洁直观:

// 高版本SDK支持的写法(SDK30+)
const result = await Expo.DocumentPicker.getDocumentAsync({
  type: ["image/*", "application/pdf"]
});

内容的提问来源于stack exchange,提问作者rodrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:53:28