【问题标题】:Using dart to download a file使用 dart 下载文件
【发布时间】:2013-08-03 13:04:19
【问题描述】:

我们可以使用dart 下载文件吗?

例如python

【问题讨论】:

    标签: dart


    【解决方案1】:

    Shailen's response 是正确的,Stream.pipe 甚至可以更短一些。

    import 'dart:io';
    
    main() async {
      final request = await HttpClient().getUrl(Uri.parse('http://example.com'));
      final response = await request.close();
      response.pipe(File('foo.txt').openWrite());
    }
    

    【讨论】:

    • 在 for 循环中执行此操作将并行启动所有下载。如何序列化?
    【解决方案2】:

    我经常使用HTTP 包。如果你想下载一个不大的文件,你可以使用 HTTP 包来获得更简洁的方法:

    import 'package:http/http.dart' as http;
    
    main() {
      http.get(url).then((response) {
        new File(path).writeAsBytes(response.bodyBytes);
      });
    }
    

    Alexandre 所写的内容对于较大的文件会表现得更好。如果您发现需要经常下载文件,请考虑为此编写一个辅助函数。

    【讨论】:

    • 在 for 循环中执行此操作将并行启动所有下载。如何序列化?
    • @PhaniRithvij 您只需在末尾添加另一个.then。不过,如果你使用 await 会更干净。
    【解决方案3】:

    我们可以使用 http.readBytes(url)。

    await File(path).writeAsBytes(await http.readBytes('https://picsum.photos/200/300/?random'));

    【讨论】:

      【解决方案4】:

      问题中链接到的 python 示例涉及请求 example.com 的内容并将响应写入文件。

      以下是在 Dart 中执行类似操作的方法:

      import 'dart:io';
      
      main() {
        var url = Uri.parse('http://example.com');
        var httpClient = new HttpClient();
        httpClient.getUrl(url)
          .then((HttpClientRequest request) {
            return request.close();
          })
          .then((HttpClientResponse response) {
            response.transform(new StringDecoder()).toList().then((data) {
              var body = data.join('');
              print(body);
              var file = new File('foo.txt');
              file.writeAsString(body).then((_) {
                httpClient.close();
              });
            });
          });
      }
      

      【讨论】:

      • 好的,这是可行的,但是如果内容是图像呢?谢谢。
      • Dart API 不能更短吗? new HttpClient() => getUrl() => close() => transform() => new StringDecoder() => toList() => close()。这还没有考虑到then() 的 4 个调用。
      • 请注意,在最新版本的 Dart 中 StringDecoder 类已被 UTF8.decoder 取代。
      【解决方案5】:

      是的,首先您必须使用 http dart 库请求文件 url,例如:

      响应响应 = await get(Uri.parse(link));

      之后,您的 Response 对象(响应)将在 self 中获取该文件,您可以简单地将响应字节写入文件,该文件将成为您下载的文件。 当我像这样打开文件时:

      文件文件 = File('image.jpg')

      然后我们必须像这样向这个文件发送响应字节:

      file.writeAsBytes(response.bodyBytes);

      现在您已成功下载图像文件..恭喜。

      另外,例如让我向您展示下载图像文件的示例代码:

      import 'dart:io';
      import 'package:http/http.dart';
      main(List<String> args) async {
      var link =
        "https://pps.whatsapp.net/v/t61.24694- 
      24/72779382_449683642563635_3243701117464346624_n.jpg?ccb=11- 
      4&oh=23e3bc2ce3f4940a70cb464494bbda76&oe=619B3B8C";
      
      Response response = await get(Uri.parse(link));
      File file = File('image.jpg');
      file.writeAsBytes(response.bodyBytes);
      }
      

      看,这是代码,在终端视图底部下载了一个名为 image.jpg 的文件是我们下载的图像。

      screen shot

      这是我们下载的实际图片。

      downloaded image

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 2014-05-18
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 2015-04-08
        • 2010-12-20
        相关资源
        最近更新 更多