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

mrwjdhj3  于 2023-02-13  发布在  Flutter
关注(0)|答案(2)|浏览(270)

Flutter中是否有一种方法或软件包可以直接从直接URL将文件下载到Android和iOS的下载文件夹中,例如:https://******/image. jpg,无需任何用户开销,只需单击并下载即可。

yfjy0ee7

yfjy0ee71#

是使用以下软件包来完全实现它:

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.\n\n" + 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/>
flvlnr44

flvlnr442#

您可以使用Dio软件包下载任何文件。
一个强大的Http客户端,支持拦截器,全局配置,表单数据,请求取消,文件下载,超时等。

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

相关问题