下载文件
想要在Flutter下载文件,能够运用Dio网络恳求库,Dio中有download函数, 定义如下:
Future<Response> download(
String urlPath,
savePath, {
ProgressCallback? onReceiveProgress,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
bool deleteOnError = true,
String lengthHeader = Headers.contentLengthHeader,
data,
Options? options,
});
-
urlPath
:网络资源的url
; -
savePath
:dynamic
类型,可所以下载后存储文件途径的字符串,也可所以一个回来字符串的回调办法(Dio 会把headers
参数带着曩昔,便利针对下载回来内容构建文件途径); -
onReceiveProgress
:文件接收进展,是一个void Function(int count, int total)
回调函数,调用者能够经过该回调办法监测下载进展。 -
deleteOnError
:发生错误时候是否删去已下载的文件,默许是 true。 -
lengthHeader
:源文件的实际巨细(未紧缩前)。默许是header
的content-length
。如果文件紧缩了,而没有指定该值的话,那进展回调里的total
会是-1
;如果运用自定义的header
指定了文件的巨细,那么total
会是自定义的header
对应的文件巨细。 -
其他参数和普通的恳求差不多,这里不再赘述。
运用此函数即可进行下载文件
获取保存文件途径
能够运用path_provider库获取保存文件的途径,path_provider
提供了如下办法:
-
getTemporaryDirectory
:运用暂时目录(可能被铲除) -
getApplicationDocumentsDirectory
:运用文档目录(不会被体系铲除,首要用户数据存储目录),对于安卓推荐运用外部存储getExternalStorageDirectory。 -
getApplicationSupportDirectory
:运用支持目录,一般放置与用户无关的数据。 -
getLibraryDirectory
:指向运用能够持久存储数据的目录,不支持安卓渠道。 -
getExternalStorageDirectory
:获取外部存储目录,不支持 iOS 渠道。 -
getExternalCacheDirectories
:获取外部缓存目录,,不支持 iOS 渠道。 -
getExternalStorageDirectories
:获取外部能够的目录列表,不支持 iOS 渠道。 -
getDownloadsDirectory
:获取下载目录,用于 Web 端,不支持安卓和 iOS渠道。
经过 path_provider
拿到Directory
对象后,就能够经过 Directory
的 path
特点获取到完整的目录途径。本例咱们是在 initialState 里获取文件存储途径的,运用的是运用文档目录。
void initState() {
getApplicationDocumentsDirectory()
.then((tempDir) => {_destPath = tempDir.path + '/zakiFlutter.docx'});
super.initState();
}
下载文件时安卓需要获取写入的权限
我运用的是permission_handler
权限办理库,代码如下
/// 申请写文件权限
final status = await Permission.storage.request();
switch (status) {
case PermissionStatus.granted:
break;
case PermissionStatus.denied:
HUDTools.showMessage('拒绝访问存储权限');
break;
case PermissionStatus.permanentlyDenied:
showXmDialog(
title: '提示',
content: '存储投稿模版需要打开存储权限,是否进入设置界面敞开?',
cancelText: '取消',
confirmText: '去敞开',
onConfirmTap: () => AppSettings.openAppSettings(),
);
break;
default:
break;
}
需要注意的是,要在.android -> app -> src -> main -> AndroidManifest.xml
中添加读写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下载本地后在iOS预览或许运用其他运用打开
Flutter有第三方库 open_filex
能够进行上述操作,可是安卓搭档在运行过程中异常,所以暂时先用flutter传递消息后,在原生进行处理的办法进行。
在iOSApp中预览文件时需要运用到UIDocumentInteractionController
这个控制器,官方释义如下
A view controller that previews, opens, or prints files whose file format cannot be handled directly by your app.
一个view controller能够用来预览,打开或许打印,不能被你的app直接处理的文件
将需要打开文件的信息发送至原生后的处理,代码如下
let ctr = UIDocumentInteractionController()
func openFile() {
let url = Bundle.main.path(forResource: "zakiFlutter", ofType: "docx")
ctr.url = URL(fileURLWithPath: enterURL)
ctr.delegate = self
///预览办法
ctr.presentPreview(animated: true)
///共享办法
ctr.presentOptionsMenu(from: self.view.bounds, in: self.view, animated: true)
}
extension zakiFlutterViewController: UIDocumentInteractionControllerDelegate {
func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
return self
}
}
注意:运用共享办法共享文件时,需要将controller放到class里持有,否则共享时会为空或许报错
总结
需要在iOS原生文件app中展示时,在Info.plist
中 新增 Supports Document Browser
为 YES。
需要在iTunes中共享时展示,在Info.plist
新增 Application supports iTunes file
sharing 为YES