Исходная статья на 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