我正在开发一个项目,需要我按一下按钮,才能从url下载文件并将其存储到手机存储中(可能是downloads文件夹)。
关于如何执行此操作的任何想法?下载的文件也不总是相同的,可以是图像,也可以是pdf。
感谢您的帮助或建议。
答案 0 :(得分:2)
如果要从没有外部库的URL下载和保存文件,则可以使用此代码。它对我有用,但是我不检查大文件。祝你好运。
Future<String> downloadFile(String url, String fileName, String dir) async {
HttpClient httpClient = new HttpClient();
File file;
String filePath = '';
String myUrl = '';
try {
myUrl = url+'/'+fileName;
var request = await httpClient.getUrl(Uri.parse(myUrl));
var response = await request.close();
if(response.statusCode == 200) {
var bytes = await consolidateHttpClientResponseBytes(response);
filePath = '$dir/$fileName';
file = File(filePath);
await file.writeAsBytes(bytes);
}
else
filePath = 'Error code: '+response.statusCode.toString();
}
catch(ex){
filePath = 'Can not fetch url';
}
return filePath;
}
对于Android,不要忘记在清单文件中添加这些行,否则在构建apk后它将无法在实际设备上运行:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 1 :(得分:1)
使用https://pub.dartlang.org/packages/flutter_downloader。不要忘记进行平台配置。
基本上,这就是您应该使用软件包的方式。链接中有一个详细的详细示例。
final taskId = await FlutterDownloader.enqueue(
url: 'your download link',
savedDir: 'the path of directory where you want to save downloaded files',
showNotification: true, // show download progress in status bar (for Android)
openFileFromNotification: true, // click on notification to open downloaded file (for Android)
);
答案 2 :(得分:0)
FlutterChina的Dio似乎是要走的路。 https://github.com/flutterchina/dio/。它功能强大,可以为您提供检索下载/上传进度的选项
答案 3 :(得分:0)
static var httpClient = new HttpClient();
Future<File> _downloadFile(String url, String filename) async {
var request = await httpClient.getUrl(Uri.parse(url));
var response = await request.close();
var bytes = await consolidateHttpClientResponseBytes(response);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = new File('$dir/$filename');
await file.writeAsBytes(bytes);
return file;
}