我正在使用Flutter 1.10.3构建一个应用程序,在将图像下载到设备的Downloads文件夹时遇到了困难。是否有一个选项可以在不使用任何第三部分库的情况下执行此操作?
hmae6n7t1#
添加一些必需的依赖项,我有一个测试演示与android只。请审查file_utils和path_provider,而你在IOS设备实现。
file_utils
path_provider
dio: ^3.0.0 path_provider: ^1.3.0 simple_permissions: ^0.1.9 file_utils: ^0.1.3
simple_permissions
permission_handler
您需要在android manifest文件上添加权限。
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
样本代码:
import 'dart:io'; import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:async'; import 'package:simple_permissions/simple_permissions.dart'; import 'package:file_utils/file_utils.dart'; import 'dart:math'; void main() => runApp(Downloader()); class Downloader extends StatelessWidget { @override Widget build(BuildContext context) => MaterialApp( title: "File Downloader", debugShowCheckedModeBanner: false, home: FileDownloader(), theme: ThemeData(primarySwatch: Colors.blue), ); } class FileDownloader extends StatefulWidget { @override _FileDownloaderState createState() => _FileDownloaderState(); } class _FileDownloaderState extends State<FileDownloader> { final imgUrl = "https://images6.alphacoders.com/683/thumb-1920-683023.jpg"; bool downloading = false; var progress = ""; var path = "No Data"; var platformVersion = "Unknown"; Permission permission1 = Permission.WriteExternalStorage; var _onPressed; static final Random random = Random(); Directory externalDir; @override void initState() { super.initState(); downloadFile(); } Future<void> downloadFile() async { Dio dio = Dio(); bool checkPermission1 = await SimplePermissions.checkPermission(permission1); // print(checkPermission1); if (checkPermission1 == false) { await SimplePermissions.requestPermission(permission1); checkPermission1 = await SimplePermissions.checkPermission(permission1); } if (checkPermission1 == true) { String dirloc = ""; if (Platform.isAndroid) { dirloc = "/sdcard/download/"; } else { dirloc = (await getApplicationDocumentsDirectory()).path; } var randid = random.nextInt(10000); try { FileUtils.mkdir([dirloc]); await dio.download(imgUrl, dirloc + randid.toString() + ".jpg", onReceiveProgress: (receivedBytes, totalBytes) { setState(() { downloading = true; progress = ((receivedBytes / totalBytes) * 100).toStringAsFixed(0) + "%"; }); }); } catch (e) { print(e); } setState(() { downloading = false; progress = "Download Completed."; path = dirloc + randid.toString() + ".jpg"; }); } else { setState(() { progress = "Permission Denied!"; _onPressed = () { downloadFile(); }; }); } } @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( title: Text('File Downloader'), ), body: Center( child: downloading ? Container( height: 120.0, width: 200.0, child: Card( color: Colors.black, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ CircularProgressIndicator(), SizedBox( height: 10.0, ), Text( 'Downloading File: $progress', style: TextStyle(color: Colors.white), ), ], ), ), ) : Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text(path), MaterialButton( child: Text('Request Permission Again.'), onPressed: _onPressed, disabledColor: Colors.blueGrey, color: Colors.pink, textColor: Colors.white, height: 40.0, minWidth: 100.0, ), ], ))); }
ohtdti5x2#
如果你控制服务器,另一个选择是让用户的系统来处理下载,在服务器上你添加一个Content-Disposition: attachment头到响应中,在nginx中你可以通过sites-enabled配置文件中的add_header指令来完成:
Content-Disposition: attachment
add_header
add_header Content-Disposition "attachment";
关于here的更多注解。然后,在Flutter端,您可以使用url_launcher包启动下载:
await launch('https://www.example.com/my_file.pdf');
这将把下载移交给安装在手机上的浏览器。并且Content-Disposition: attachment头将告诉浏览器它将被下载而不是显示或播放。这个解决方案非常简单,尽管它不能给予您控制文件下载到哪里。
j2cgzkjk3#
使用flutter_downloader具有:
在github上查看示例
3条答案
按热度按时间hmae6n7t1#
添加一些必需的依赖项,我有一个测试演示与android只。请审查
file_utils
和path_provider
,而你在IOS设备实现。simple_permissions
已断开连接,请使用此依赖关系permission_handler
您需要在android manifest文件上添加权限。
样本代码:
ohtdti5x2#
如果你控制服务器,另一个选择是让用户的系统来处理下载,在服务器上你添加一个
Content-Disposition: attachment
头到响应中,在nginx中你可以通过sites-enabled配置文件中的add_header
指令来完成:关于here的更多注解。
然后,在Flutter端,您可以使用url_launcher包启动下载:
这将把下载移交给安装在手机上的浏览器。并且
Content-Disposition: attachment
头将告诉浏览器它将被下载而不是显示或播放。这个解决方案非常简单,尽管它不能给予您控制文件下载到哪里。
j2cgzkjk3#
使用flutter_downloader具有:
在github上查看示例