Skip to content

Instantly share code, notes, and snippets.

@ajmaln
Last active February 20, 2024 17:12
Show Gist options
  • Save ajmaln/c591cfb71d66bb6e688fe7027cbbe606 to your computer and use it in GitHub Desktop.
Save ajmaln/c591cfb71d66bb6e688fe7027cbbe606 to your computer and use it in GitHub Desktop.
Download file with progress in Dart/Flutter using 'http' package
import 'dart:typed_data';
import 'dart:io';
import 'package:http/http.dart';
import 'package:path_provider/path_provider.dart';
downloadFile(String url, {String filename}) async {
var httpClient = http.Client();
var request = new http.Request('GET', Uri.parse(url));
var response = httpClient.send(request);
String dir = (await getApplicationDocumentsDirectory()).path;
List<List<int>> chunks = new List();
int downloaded = 0;
response.asStream().listen((http.StreamedResponse r) {
r.stream.listen((List<int> chunk) {
// Display percentage of completion
debugPrint('downloadPercentage: ${downloaded / r.contentLength * 100}');
chunks.add(chunk);
downloaded += chunk.length;
}, onDone: () async {
// Display percentage of completion
debugPrint('downloadPercentage: ${downloaded / r.contentLength * 100}');
// Save the file
File file = new File('$dir/$filename');
final Uint8List bytes = Uint8List(r.contentLength);
int offset = 0;
for (List<int> chunk in chunks) {
bytes.setRange(offset, offset + chunk.length, chunk);
offset += chunk.length;
}
await file.writeAsBytes(bytes);
return;
});
});
}
@JohnGalt1717
Copy link

This really should stream the chunks into the file as it goes instead of holding them in memory.

@flutternoob
Copy link

How to implement error handling? I tried implementing onError: (handleError), where i try to show a snackbar if download fails due to loss of internet connection ,but its not working.

@JohnGalt1717
Copy link

@flutternoob My solution was to wrap the entire thing in an try/catch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment