Исходная статья на https://fluttermaster.com/download-files-in-dart/

Вам может потребоваться загрузка файлов для выполнения задач в ваших приложениях. В этой статье я покажу вам, как загружать файлы в Dart. То же самое можно применить и к Flutter.

Скачать файлы в Dart

По умолчанию язык Dart предоставляет разработчикам базовый класс для обработки HTTT-запросов и ответов веб-серверу. Таким образом, мы можем использовать это для загрузки файлов с удаленных серверов.

Класс HttpClient

Класс, который мы ищем для обработки HTTP-запросов и ответов, - это HttpClient, который принадлежит пакету dart: io.

Ознакомьтесь с важным примечанием из официальной документации.

Важно: браузерные приложения не могут использовать эту библиотеку. Только серверы, сценарии командной строки и мобильные приложения Flutter могут импортировать и использовать dart: io.

Что это значит?

Что ж, это означает, что мы также можем использовать любой класс пакета dart: io для разработки мобильных приложений Flutter. Замечательно!

Вернемся к классу HttpClient. Вот пример того, как сделать запрос и обработать ответ с его помощью.

HttpClient client = new HttpClient();
client.getUrl(Uri.parse("http://www.example.com/"))
    .then((HttpClientRequest request) {
      // Optionally set up headers...
      // Optionally write to the request object...
      // Then call close.
      ...
      return request.close();
    })
    .then((HttpClientResponse response) {
      // Process the response.
      ...
    });

Хорошо, вот что мы собираемся использовать для загрузки файлов из Интернета.

Обработка HTTP-ответа

Поскольку HttpClientResponse - это просто тип Stream ‹List ‹int››, мы можем сохранить их как необработанные байты или преобразовать в текст, если это читаемый текстовый файл.

1. Работа с читаемым текстовым файлом

Чтобы обрабатывать читаемый контент, нам нужно преобразовать его в текстовый контент, обычно в формате UTF-8. Вот как это работает.

HttpClient client = new HttpClient();
client.getUrl(Uri.parse("https://fluttermaster.com/"))
  .then((HttpClientRequest request) {
    return request.close();
  })
  .then((HttpClientResponse response) {
    response.transform(utf8.decoder).listen((contents) => print(contents));
  });

Чтобы сохранить в файл, попробуйте следующий код.

HttpClient client = new HttpClient();
var _downloadData = StringBuffer();
var fileSave = new File('./index.html');
client.getUrl(Uri.parse("https://fluttermaster.com/"))
  .then((HttpClientRequest request) {
    return request.close();
  })
  .then((HttpClientResponse response) {
    response.transform(utf8.decoder).listen((d) => _downloadData.write(d),
      onDone: () {
        fileSave.writeAsString(_downloadData.toString());
      }
    );
  });

Здесь нет ничего особенного. Что вам нужно сделать, так это обработать объект ответа, возвращаемый из экземпляра HttpClient.

2. Обработка двоичных файлов

Двоичные файлы - это файлы, которые нельзя читать как обычные текстовые файлы. Это могут быть файлы изображений, такие как J PG, PNG, GIF, или медиафайлы, такие как MOV, MP4, MP3, AVI, или что-то еще…

Чтобы обрабатывать двоичные файлы, нам нужно обрабатывать вывод как байты.

HttpClient client = new HttpClient();
var _downloadData = List<int>();
var fileSave = new File('./logo.png');
client.getUrl(Uri.parse("https://fluttermaster.com/wp-content/uploads/2018/08/fluttermaster.com-logo-web-header.png"))
  .then((HttpClientRequest request) {
    return request.close();
  })
  .then((HttpClientResponse response) {
    response.listen((d) => _downloadData.addAll(d),
      onDone: () {
        fileSave.writeAsBytes(_downloadData);
      }
    );
  });

Это очень похоже на обработку файлов с читаемым содержимым, вместо строки мы используем байт.

Использование струйной трубы

Если вам утомительно использовать listen() для обработки потока, вы можете использовать pipe() для удобства.

Вот образец:

HttpClient client = new HttpClient();
client.getUrl(Uri.parse("https://fluttermaster.com/wp-content/uploads/2018/08/fluttermaster.com-logo-web-header.png"))
  .then((HttpClientRequest request) {
    return request.close();
  })
  .then((HttpClientResponse response) {
      response.pipe(new File('./logo_pipe.png').openWrite());
  });

Он работает со всеми типами файлов и работает как универсальный загрузчик файлов.

Резюме

Загрузка файлов в Dart должна быть простой задачей, и это действительно так.

Кроме того, весь приведенный выше код выполняется асинхронно, поэтому он не блокирует дальнейшие операции в вашем коде.

Весь исходный код этого руководства размещен здесь, на Github: https://github.com/petehouston/learn-dart/blob/master/bin/download_file.dart

Если у вас есть другие приемы и советы по загрузке файлов в Dart, поделитесь со мной, мне тоже интересно.

Подпишитесь на меня, если вы хотите прочитать больше интересных статей об обучающих материалах и разработке Flutter.

Прочтите блог на https://fluttermaster.com