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

Expo应用使用FileSystem从Blob生成PDF后无法访问该如何解决?

问题原因
  1. 你复制到浏览器的URI是file://开头的Expo应用私有沙箱路径,Android和iOS的应用沙箱都是隔离的,浏览器没有权限访问其他应用的私有目录文件,所以会出现访问错误,这个属于系统权限限制,不是代码bug。
  2. 如果你分享文件后,在其他支持PDF的应用中也无法打开,说明你生成的PDF文件本身是损坏的,核心原因是请求接口时没有指定返回类型为二进制流,response.data拿到的是被自动转码的字符串,后续转Blob、写Base64的过程中破坏了PDF的二进制结构。
修复方案
  • 首先修正接口请求配置,请求PDF接口时明确指定返回类型为Blob:
    如果你用fetch:
    const response = await fetch('你的PDF接口地址', {
      // 其他请求配置
      responseType: 'blob'
    });
    
    如果你用axios:
    const response = await axios.get('你的PDF接口地址', {
      // 其他请求配置
      responseType: 'blob'
    });
    
  • 推荐使用更简洁的Expo官方提供的方案,避免手动转码出错,直接用FileSystem.downloadAsync下载并保存PDF:
    import * as FileSystem from 'expo-file-system';
    import * as Sharing from 'expo-sharing';
    
    // 下载保存并分享PDF
    const saveAndSharePdf = async () => {
      const targetUri = `${FileSystem.documentDirectory}generated.pdf`;
      try {
        const downloadResult = await FileSystem.downloadAsync(
          '你的PDF接口地址',
          targetUri,
          {
            headers: {
              // 按需添加接口需要的鉴权头、自定义头等
            }
          }
        );
        if (downloadResult.status === 200) {
          await Sharing.shareAsync(targetUri);
        }
      } catch (err) {
        console.error('PDF处理失败', err);
      }
    }
    
  • 如果你需要保留现有Blob处理逻辑,可新增文件校验步骤:写入完成后调用FileSystem.getInfoAsync(targetUri)查看文件大小,和接口返回的content-length响应头对比,大小一致才说明文件写入正常。
  • 验证PDF有效性时,不要直接把沙箱路径粘贴到浏览器,直接调用分享功能发到第三方PDF查看应用(如WPS、系统自带文件管理)打开验证即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:06:03