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
相关产品推荐
相关产品推荐

