下载文件

想要在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

  • savePathdynamic 类型,可所以下载后存储文件途径的字符串,也可所以一个回来字符串的回调办法(Dio 会把 headers 参数带着曩昔,便利针对下载回来内容构建文件途径);

  • onReceiveProgress:文件接收进展,是一个void Function(int count, int total)回调函数,调用者能够经过该回调办法监测下载进展。

  • deleteOnError:发生错误时候是否删去已下载的文件,默许是 true。

  • lengthHeader:源文件的实际巨细(未紧缩前)。默许是 headercontent-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对象后,就能够经过 Directorypath 特点获取到完整的目录途径。本例咱们是在 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