使用FlutterDownloader下载特定文件时出现权限异常问题
问题分析与解决方案
问题现象
- 可正常下载的资源地址:
https://cm.blazefast.co/1b/bb/1bbb3ad2d5d8e759166145fd82cfdbf6.jpg - 无法下载的资源地址(HTTP状态码返回200):
https://lc3-cdn.t34798ndc.com/r25ZyBe/Fx8e_AxtJ_XMJ/M/Mx-4iJj-Mx-jVJj-wVJ/tM.0pUT0/XE.U/6lZG.pTcSUWW/tM.pTcSUWm-fa1.U/TU-UcSTSTDWHU.Yyk.jpg - 核心错误日志:
W/System.err(11668): java.io.IOException: Operation not permitted ... E/DownloadWorker(11668): Create a file using java.io API failed ... W/System.err(11668): java.lang.NullPointerException
原因推测
你通过http.get能拿到200响应,但FlutterDownloader插件的默认请求头未通过目标CDN的校验,导致实际下载请求被限制,进而引发文件创建失败、空指针等连锁异常;或是插件对该类URL的响应处理存在兼容性问题。
解决方案
1. 给FlutterDownloader添加自定义请求头
模拟浏览器或你http.get请求的头信息(如User-Agent、Referer),确保CDN认可该请求:
await FlutterDownloader.enqueue( url: url, savedDir: savePath, fileName: isManga ? "$number.png" : "$number.mp4", showNotification: true, openFileFromNotification: true, 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", // 根据实际需求添加Referer等其他必要请求头 }, );
2. 直接写入响应体替代FlutterDownloader
既然已通过http.get获取到响应内容,可跳过插件直接将文件写入本地:
var url2 = Uri.parse(url); var response = await http.get(url2); Directory a = Directory(savePath); if (response.statusCode == 200 && await a.exists()) { try { final filePath = "$savePath/${isManga ? "$number.png" : "$number.mp4"}"; final file = File(filePath); await file.writeAsBytes(response.bodyBytes); // 可自行添加下载完成的通知或状态更新逻辑 } catch (error) { print(error); } }
3. 确认目录权限细节
虽然第一个资源能正常下载,仍可确认savePath为应用专属目录,避免系统权限策略变化导致的异常:
import 'package:path_provider/path_provider.dart'; // 获取应用专属外部存储目录 final directory = await getExternalStorageDirectory(); final savePath = directory!.path; // 或使用应用文档目录 // final directory = await getApplicationDocumentsDirectory();
内容的提问来源于stack exchange,提问作者AnimeZero
相关产品推荐
相关产品推荐

