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

React Native安卓应用使用rnFetchBlob部署到Elastic Beanstalk后无法下载PDF

问题诊断与解决方案

你遇到的Status Code = 16是Android系统DownloadManager的标准错误码,对应ERROR_HTTP_DATA_ERROR,指下载过程中出现了HTTP层面的传输异常。本地localhost运行正常、部署到Elastic Beanstalk后报错,可按照以下步骤排查修复:

1. 排查域名与证书配置问题

  • 确认urls.ORDER_URL对应的线上地址使用的是CA签发的有效HTTPS证书,不要使用自签名证书,系统DownloadManager默认不信任自签名证书
  • 安卓9及以上系统默认禁用明文HTTP请求,如果你的线上地址还是HTTP协议,需要在AndroidManifest.xml的application节点添加配置android:usesCleartextTraffic="true"(生产环境不建议使用该配置,优先切换为HTTPS)

2. 修复请求头传递问题

当你开启useDownloadManager: true时,RNFetchBlob不会将自定义请求头传递给系统DownloadManager,导致线上接口校验Authorization失败。修复方案二选一:

方案A:将认证信息拼接至URL参数

修改请求地址,把token放到query参数中,后端同步兼容从query参数读取认证信息:

.fetch('GET', urls.ORDER_URL + '/order/download?orderId=' + orderId + '&access_token=' + token, { 'Cache-Control': 'no-store' })

方案B:关闭系统下载管理器

修改options配置,不使用系统DownloadManager,RNFetchBlob会自行处理下载逻辑,请求头会正常传递:

addAndroidDownloads: {
    useDownloadManager: false, // 修改为false
    notification: true,
    mime: 'application/pdf',
    title: "Test Invoice", 
    path: DownloadDir + "/" + new Date().getTime() + ".pdf", 
    description: 'Downloading file.',
    mediaScannable: true
}

3. 调整后端响应头配置

检查Elastic Beanstalk上部署的后端服务响应头:

  • 必须返回正确的Content-Type: application/pdf
  • 必须返回Content-Length头,不要使用分块传输(Transfer-Encoding: chunked),系统DownloadManager对分块传输的文件兼容性差
  • 可尝试删除请求中的Cache-Control: no-store参数,避免和后端缓存配置冲突

4. 权限校验

确认应用已经申请了对应安卓版本的存储权限:

  • 安卓12及以下:申请WRITE_EXTERNAL_STORAGE权限
  • 安卓13及以上:申请READ_MEDIA_IMAGES、POST_NOTIFICATIONS权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:00