Flutter使用Dio下载文件时遭遇HTTP 403错误求助
Flutter Dio下载图片出现HTTP 403错误的原因及解决办法
错误本质
HTTP 403状态码表示服务器拒绝了你的请求,和存储权限无关——你已配置存储权限,且错误栈明确显示问题出在Dio的请求阶段,而非文件写入阶段。
核心原因
Picsum Photos这类图片服务会拦截缺少合法User-Agent标识的请求。默认情况下Dio发起的请求未携带符合浏览器规范的User-Agent,被服务器判定为非合法请求,因此返回403。
解决办法
给Dio实例添加标准的User-Agent请求头,模拟浏览器请求:
修改downloadFile方法如下:
Future<void> downloadFile() async{ Dio dio= Dio(); // 添加浏览器标识的User-Agent dio.options.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'; try{ var dir= await getApplicationDocumentsDirectory(); await dio.download(uri, "${dir.path}/myimg.jpg", onReceiveProgress: (rec,total){ setState(() { downloading=true; }); }); }catch(e) { print("Error >> "+e.toString()); } setState(() { downloading=false; print("Download Completes"); }); }
额外优化
- 移除不必要的权限:你是将文件存储到应用私有目录(
getApplicationDocumentsDirectory()返回的路径),Android 10及以上版本不需要READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,可以从AndroidManifest.xml中删除这两个权限,减少不必要的权限申请。
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

