【问题标题】:Download file from url, save to phones storage从 url 下载文件,保存到手机存储
【发布时间】:2019-06-09 08:36:18
【问题描述】:

我正在做一个项目,一旦点击按钮,我需要从 URL 下载文件,并将其存储到手机存储(可能是下载文件夹)。

关于如何做到这一点的任何想法?正在下载的文件也不总是相同的,可以是从图像到 pdf 的任何内容。

【问题讨论】:

标签: file download flutter


【解决方案1】:

使用https://pub.dartlang.org/packages/flutter_downloader。不要忘记进行平台配置。

基本上,这就是您应该如何使用该包的方式。链接中有详细的长示例。

final taskId = await FlutterDownloader.enqueue(
  url: 'your download link',
  savedDir: 'the path of directory where you want to save downloaded files',
  showNotification: true, // show download progress in status bar (for Android)
  openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);

编辑:有人说上面的包维护得很好。试试这个 https://pub.dev/packages/flowder

【讨论】:

  • 非常感谢。不敢相信我没有早点找到这个图书馆。顺便说一句,你如何指定下载文件夹的路径?我知道你是如何在 linux 等系统中移动的,但是它在这里是如何工作的呢?
  • 我很接近,但我无法获得工作权限.. 我的应用程序具有存储权限,甚至为此安装了权限插件,但我不断收到“操作系统错误:权限被拒绝,errno = 13”。 。 有任何想法吗?试图找到一个解决方案,但它似乎不起作用
  • 你做了平台特定的权限吗?像 Android 中的 Manifest?
  • 这个包有问题!
  • 这个包有问题,没有维护。 @westdabestdb 还有其他选择吗?
【解决方案2】:

如果您想在没有外部库的情况下从 URL 下载和保存文件,可以使用此代码。它对我有用,但我不在大文件上检查它。祝你好运。

Future<String> downloadFile(String url, String fileName, String dir) async {
        HttpClient httpClient = new HttpClient();
        File file;
        String filePath = '';
        String myUrl = '';
    
        try {
          myUrl = url+'/'+fileName;
          var request = await httpClient.getUrl(Uri.parse(myUrl));
          var response = await request.close();
          if(response.statusCode == 200) {
            var bytes = await consolidateHttpClientResponseBytes(response);
            filePath = '$dir/$fileName';
            file = File(filePath);
            await file.writeAsBytes(bytes);
          }
          else
            filePath = 'Error code: '+response.statusCode.toString();
        }
        catch(ex){
          filePath = 'Can not fetch url';
        }
    
        return filePath;
      }

对于Android,不要忘记在manifest文件中添加这几行,否则构建apk后将无法在真机上运行:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • @MillieHudson 将文件保存到设备上的路径不会影响应用程序的性能。您处理下载的方式会影响性能。
【解决方案3】:

FlutterChina 的 Dio 似乎是要走的路。 https://github.com/flutterchina/dio/。它功能强大,并为您提供检索下载/上传进度的选项

【讨论】:

    【解决方案4】:
    static var httpClient = new HttpClient();
    Future<File> _downloadFile(String url, String filename) async {
      var request = await httpClient.getUrl(Uri.parse(url));
      var response = await request.close();
      var bytes = await consolidateHttpClientResponseBytes(response);
      String dir = (await getApplicationDocumentsDirectory()).path;
      File file = new File('$dir/$filename');
      await file.writeAsBytes(bytes);
      return file;
    }
    

    【讨论】:

    • 在哪里下载的?我没有在 android 的“下载”文件夹中找到下载的文件。有什么建议吗?
    猜你喜欢
    • 2020-08-13
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多