Flutter自动从url下载文件到下载目录



是否有一种方法或一个包在Flutter下载文件直接下载文件夹为Android和iOS从一个直接的URL,例如:https://******/image.jpg,没有任何用户开销只是点击和下载..

可以使用以下包来完全实现:

dio: ^4.0.0
path_provider: ^2.0.2
permission_handler: ^8.0.0+2

则使用以下代码:

定义变量:

late String _localPath;
late bool _permissionReady;
late TargetPlatform? platform;

获取initState()中的设备平台

@override
void initState() {
super.initState();
if (Platform.isAndroid) {
platform = TargetPlatform.android;
} else {
platform = TargetPlatform.iOS;
}
}

用于检查和请求设备权限:

Future<bool> _checkPermission() async {
if (platform == TargetPlatform.android) {
final status = await Permission.storage.status;
if (status != PermissionStatus.granted) {
final result = await Permission.storage.request();
if (result == PermissionStatus.granted) {
return true;
}
} else {
return true;
}
} else {
return true;
}
return false;
}

准备查找本地路径:

Future<void> _prepareSaveDir() async {
_localPath = (await _findLocalPath())!;
print(_localPath);
final savedDir = Directory(_localPath);
bool hasExisted = await savedDir.exists();
if (!hasExisted) {
savedDir.create();
}
}
Future<String?> _findLocalPath() async {
if (platform == TargetPlatform.android) {
return "/sdcard/download/";
} else {
var directory = await getApplicationDocumentsDirectory();
return directory.path + Platform.pathSeparator + 'Download';
}
}

,最后下载文件:

InkWell(
onTap: () async {
_permissionReady = await _checkPermission();
if (_permissionReady) {
await _prepareSaveDir();
print("Downloading");
try {
await Dio().download("https://******/image.jpg",
_localPath + "/" + "filename.jpg");
print("Download Completed.");
} catch (e) {
print("Download Failed.nn" + e.toString());
}
}
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle, color: Colors.grey.withOpacity(0.5)),
padding: EdgeInsets.all(8),
child: Icon(Icons.download, color: Colors.black),
));

确保您已经在AndroidManifest.xml中添加了所需的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

编辑:

如果你的应用程序目录没有显示在iOS文件中,那么在Info.plist

中添加下面的行
<key>UISupportsDocumentBrowser</key>
<true/>

您可以使用Dio包下载任何文件。

一个强大的Dart Http客户端,支持拦截器,全局配置,表单数据,请求取消,文件下载,超时等。

import 'package:dio/dio.dart';
var dio = Dio();
response = await dio.download('https://******/image.jpg');

如果你有这个问题OS Error Permission denied errno = 13,那么我有解决方案

如果你正在使用path_provider和dio API,那么你将面临这个问题

你只需要使用flutter_file_downloader: ^1.1.0+1 dependency..进入pub.dev,阅读该依赖项的文档并使用它。

最新更新