11
votes

Utiliser DART pour télécharger un fichier

pouvons-nous utiliser dart pour télécharger un fichier?

Par exemple dans Python


0 commentaires

4 Réponses :


2
votes

L'exemple Python lié à la question implique de demander le contenu de exemple.com code> et d'écrire la réponse à un fichier.

Voici comment vous pouvez faire quelque chose de similaire dans DART: P>

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();
        });
      });
    });
}


3 commentaires

Ok, donc c'est faisable, mais que diriez-vous si le contenu est une image? Merci.


Est-ce que l'API DART ne peut pas être plus courte? Nouveau httpClient () => getURL () => fermeture () => transformé () => < Code> Nouveau StringDecoder () => Tolist () => Fermer () . Et ceci est sans prendre en compte les 4 appels alors () .


Veuillez noter que la classe stringdecoder a été remplacée par utf8.decoder dans les versions récentes de Dart.



14
votes

La réponse de Shailen est correcte et peut même être un peu plus courte avec 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());
}


1 commentaires

Faire cela dans A pour boucle commencerait tous les téléchargements en parallèle. Comment sérialiser cela?



23
votes

J'utilise le package http beaucoup. Si vous souhaitez télécharger un fichier qui n'est pas énorme, vous pouvez utiliser le package HTTP pour une approche de nettoyage: xxx

Qu'est-ce que Alexandre a écrit fonctionnera mieux pour les fichiers plus importants. Envisagez d'écrire une fonction d'assistance pour cela si vous trouvez le besoin de télécharger des fichiers souvent.


2 commentaires

Faire cela dans A pour boucle commencerait tous les téléchargements en parallèle. Comment sérialiser cela?


@Phanirithvij Vous alliez simplement ajouter un autre .Chen à la fin. C'est beaucoup plus propre si vous utilisez attendre à la place.



2
votes

Nous pouvons utiliser http.readbytes (URL).

Await le fichier (chemin) .wreeEsbytes (attendre http.readbytes (' https: // picsum. Photos / 200/300 /? aléatoire '));


0 commentaires