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

问题描述 投票:0回答:3

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

flutter https
3个回答
26
投票

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

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/>

4
投票

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

Dart 的强大 Http 客户端,支持 Interceptors、Global 配置、FormData、请求取消、文件下载、 超时等

示例

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

0
投票

如果您遇到此问题 OS Error Permission returned errno = 13,那么我有解决方案

如果你使用path_provider和dio API那么你会面临这个问题

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

© www.soinside.com 2019 - 2024. All rights reserved.