当前位置: 首页 > news >正文

Flutter:文件上传与下载(下载后预览)

Dio

dio是一个强大的Dart Http请求库,提供了丰富的功能和易于使用的API,支持文件上传和下载。
这个就不介绍了,网上有很多的封装案例。

background_downloader

简介
适用于iOS,Android,MacOS,Windows和Linux的后台文件下载器和上传器。

官方文档
https://pub-web.flutter-io.cn/packages/background_downloader

安装

flutter pub add background_downloader

示例1:下载

class _MyHomePageState extends State<MyHomePage> {// 文件信息String fileInfo = '';// 下载进度double progress = 0.0;// 任务状态String taskStatus = '';// 任务late DownloadTask task;// 下载单个文件_downloadFile() async {task = DownloadTask(url:'https://vd3.bdstatic.com/mda-ma6igm4b0znfbqve/sc/cae_h264_nowatermark/1609998111/mda-ma6igm4b0znfbqve.mp4', // 下载地址// urlQueryParameters: {'q': 'pizza'},  // 请求参数filename: 'mov_bbb.mp4', // 文件名//headers: {'myHeader': 'value'},  请求头directory: 'my_sub_directory', // 文件存储目录updates: Updates.statusAndProgress, // 更新任务状态和下载进度requiresWiFi: true, // 使用wifiretries: 5, // 下载的重试次数allowPause: true, // 运行暂停metaData: 'data for me' // 元数据,可以存储一些对于下载任务有用的信息,方便后续相关操作);// 监听下载final result =await FileDownloader().download(task, onProgress: (progress) {setState(() {this.progress = progress;});}, onStatus: (states) {String msg = '';if (states == TaskStatus.complete) {msg = '下载完成';//  下载完成后,将文件移动到共享目录后,其他应用也可以访问。否则只能在本应用内访问FileDownloader().moveToSharedStorage(task, SharedStorage.downloads);} else if (states == TaskStatus.canceled) {msg = '已取消';setState(() {progress = 0;});} else if (states == TaskStatus.paused) {msg = '已暂停';} else if (states == TaskStatus.running) {msg = '下载中...';} else {msg = '下载失败';}setState(() {taskStatus = msg;});});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title),),body: Column(children: [const SizedBox(height: 20,),Text("文件信息:$fileInfo"),const SizedBox(height: 20,),Row(children: [const Text("下载进度:"),Expanded(child: LinearProgressIndicator(value: progress,backgroundColor: Colors.greenAccent,valueColor: const AlwaysStoppedAnimation<Color>(Colors.red),)),Text("${(progress * 100).toStringAsFixed(1)}%")],),Text("任务状态:$taskStatus"),const SizedBox(height: 20,),Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,mainAxisSize: MainAxisSize.max,children: [ElevatedButton(onPressed: _downloadFile, child: const Text("下载")),ElevatedButton(onPressed: () async {// 暂停任务await FileDownloader().pause(task);},child: const Text("暂停")),ElevatedButton(onPressed: () async {//  根据固定的任务id取消await FileDownloader().cancelTaskWithId(task.taskId);// 取消所有//FileDownloader().cancelTasksWithIds(taskIds)},child: const Text("取消")),ElevatedButton(onPressed: () async {await FileDownloader().resume(task);},child: const Text("恢复"))],)],));}
}

注意:

  • 默认下载的文件是在本应用内,其他应用无访问权限。要想要被访问到需要在下载完成后执行 FileDownloader().moveToSharedStorage(task, SharedStorage.downloads);
  • 点击暂停后,再点击恢复可以继续下载。点击取消后,再点击恢复无法继续下载。

在这里插入图片描述

在这里插入图片描述

示例2:上传

/// define the multi-part upload task (subset of parameters shown)
final task = UploadTask(url: 'https://myserver.com/uploads',filename: 'myData.txt',fields: {'datafield': 'value'},fileField: 'myFile', updates: Updates.statusAndProgress // request status and progress updates
);// Start upload, and wait for result. Show progress and status changes
// while uploading
final result = await FileDownloader().upload(task,onProgress: (progress) => print('Progress: ${progress * 100}%'),onStatus: (status) => print('Status: $status')
);// Act on result, similar to download

这个没有服务器,没有尝试,上面的是官方例子。

示例3:批量下载

final tasks = [task1, task2, task3]; // a list of Download tasks// download the batch
final result = await FileDownloader().downloadBatch(tasks,batchProgressCallback: (succeeded, failed) =>print('Completed ${succeeded + failed} out of ${tasks.length}, $failed failed')
);

使用DownloadTask会返回一个任务,多个任务可以使用downloadBatch来进行批量下载。

示例4:发起通知

按照官方例子试了一下,一直没有发起通知。
我这里的问题是app没有通知权限,在设置里也无法开启通知。
如果你也没有成功的话,可以使用flutter_local_notifications来实现通知功能
Flutter:flutter_local_notifications——消息推送的学习
在这里插入图片描述

示例5:打开下载文件

  _downloadFile() async {task = DownloadTask(url:'https://ppt.1ppt.com/uploads/soft/2307/1-230H1092638.zip', // 下载地址// urlQueryParameters: {'q': 'pizza'},  // 请求参数filename: '1-230H1092638.zip', // 文件名//headers: {'myHeader': 'value'},  请求头directory: 'my_sub_directory', // 文件存储目录baseDirectory: BaseDirectory.applicationSupport,updates: Updates.statusAndProgress, // 更新任务状态和下载进度requiresWiFi: true, // 使用wifiretries: 5, // 下载的重试次数allowPause: true, // 运行暂停metaData: 'data for me' // 元数据,可以存储一些对于下载任务有用的信息,方便后续相关操作);// 监听下载final result =await FileDownloader().download(task, onProgress: (progress) {setState(() {this.progress = progress;});}, onStatus: (states) async{String msg = '';if (states == TaskStatus.complete) {msg = '下载完成';await FileDownloader().openFile(task: task);print("路径:${await task.filePath()}");} else if (states == TaskStatus.canceled) {msg = '已取消';setState(() {progress = 0;});} else if (states == TaskStatus.paused) {msg = '已暂停';} else if (states == TaskStatus.running) {msg = '下载中...';} else {msg = '下载失败';}setState(() {taskStatus = msg;});});}

注意:

  • 必须要添加 baseDirectory: BaseDirectory.applicationSupport,,否则是无法打开文件的
  • 如果要打开文件,那么就不能使用FileDownloader().moveToSharedStorage(task, SharedStorage.downloads);移动文件,会导致找不到文件进而打不开。另外打开文件时会调用你手机里有的应用程序打开,我试了一下图片、mp4下载完成后是可以直接打开的,但是zip这样的文件是无法直接打开的,这时会让你选择你手机里的应用来打开。

遇到的问题

在这里插入图片描述
这是因为background_downloader要求最小的sdk版本是24,而Flutter会自动设置minSdkVersion为16(Android 4.1),在你的Flutter项目的android/app/build.gradle文件中,将minSdkVersion更改为24或更高的版本。然后运行flutter clean清理项目,并重新构建你的应用程序。
在这里插入图片描述
从flutter仓库找到了该问题的解决方案:https://github.com/flutter/flutter/issues/119247

android / app/build.gradle文件中添加

configurations.all {resolutionStrategy {eachDependency {if ((requested.group == "org.jetbrains.kotlin") && (requested.name.startsWith("kotlin-stdlib"))) {useVersion("1.8.0")}}}
}

相关文章:

Flutter:文件上传与下载(下载后预览)

Dio dio是一个强大的Dart Http请求库&#xff0c;提供了丰富的功能和易于使用的API&#xff0c;支持文件上传和下载。 这个就不介绍了&#xff0c;网上有很多的封装案例。 background_downloader 简介 适用于iOS&#xff0c;Android&#xff0c;MacOS&#xff0c;Windows和L…...

[前端系列第6弹]Ajax简明教程:轻松实现Web页面的异步交互

在这篇文章中&#xff0c;我将介绍Ajax的基本概念、原理、优缺点、实现方法和应用场景&#xff0c;以及如何使用它来实现Web页面的异步交互。还将给一些简单而实用的例子&#xff0c;让你可以跟着我一步一步地编写自己的Ajax代码。 目录 一、什么是Ajax 二、如何使用Ajax &a…...

ssh-keygen 做好免密登录后不生效

免密说明 通常情况下&#xff0c;我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦&#xff0c;因此我们可以在两台服务器上做免密登录&#xff0c;即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时&#xff0c;…...

【Java可执行命令】(十八)可视化监控和管理工具 jconsole:获取 JVM的内存使用情况、线程活动、GC 行为等重要指标的可视化工具 ~

Java可执行命令之jconsole 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 注意事项 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 jconsole 是 Java Development Kit (JDK) 自带的一款图形化监控和管理工具。它旨在提供一个简单而强大的界面&#xff0c;用于监视和管…...

leetcode做题笔记66

给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路一&#xff1a;模拟题意 int* plusOne(i…...

【docker】设置 docker 国内镜像报错,解决方案

一、报错&#xff1a; [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…...

mac安装nvm管理工具遇到的问题和解决方法

nvm 是一款可以管理多版本node的工具&#xff0c;因为是刚买没多久的电脑之前用的都是windows&#xff0c;昨天折腾了一下午终于倒腾好了 第一步&#xff1a; 卸载电脑已有的node&#xff1b;访问nvm脚本网址&#xff0c;另存为到电脑上任何目录&#xff0c;我是放在桌面上的…...

DocX 生成Word

当然&#xff0c;这里是一个使用DocX库在.NET Core中操作Word文档的简单示例&#xff1a; 首先&#xff0c;确保你在项目中安装了DocX库。你可以在NuGet包管理器中搜索并安装DocX。 然后&#xff0c;使用以下代码来创建一个简单的Word文档并添加一些内容&#xff1a; using …...

数据库新闻速递 -- POSTGRESQL 正在蚕食数据库市场 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…...

PAT 1085 Perfect Sequence

个人学习记录&#xff0c;代码难免不尽人意 Sample Input: 10 8 2 3 20 4 5 1 6 7 8 9 Sample Output: 8 #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string> #include<map> #include<cmath&…...

软件测试面试夺命连环十七问,你答得上来么?这都不会建议多学!

1. 给你一个网站&#xff0c;该如何测试&#xff1f;&#xff08;探究需求制订计划&#xff09; 首先&#xff0c;查找需求说明、网站设计等相关文档&#xff0c;分析测试需求。 制定测试计划&#xff0c;确定测试范围和测试策略&#xff0c;一般包括以下几个部分&#xff1a…...

【学习FreeRTOS】第5章——FreeRTOS任务挂起与恢复

1.任务的挂起与恢复的API函数 vTaskSuspend() ——挂起任务&#xff08;类似暂停&#xff0c;可恢复&#xff0c;但删除任务&#xff0c;无法恢复&#xff09;vTaskResume() ——恢复被挂起的任务xTaskResumeFromISR()—— 在中断中恢复被挂起的任务 1.1.任务挂起函数vTaskSu…...

gitblit-使用

1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”&#xff0c;然后点击图中“创建版本库” 填写名称和描述&#xff0c;注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…...

整数中1出现的次数(从1到n整数中1出现的次数)

解题思路1&#xff1a; 设定整数点&#xff08;如1、10、100等等&#xff09;作为位置点i&#xff08;对应n的各位、十位、百位等等&#xff09;&#xff0c;分别对每个数位上有多少包含1的点进行分析。 第一步&#xff1a;对n进行分割&#xff0c;分为两部分&#xff1a;高位…...

Vue2:路由

Vue2&#xff1a;路由 Date: May 28, 2023 Sum: vue-router基本使用、高级用法 单页面应用程序 概念&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 案例&#xff1a; 单页应用网站&#xff1a; 网易云音乐 https://music.163.com/ 多页…...

【Docker】Docker的应用场景,Docker 的优点,Ubuntu Docker 安装,使用 Shell 脚本进行安装

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…...

CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver

前言&#xff1a;自己想使用该技术实现自动化抓取音乐&#xff0c;目前在window上运行成功&#xff0c;需要在Linux Centos服务上跑&#xff0c;配置上出现了许多问题&#xff0c;特此记录。 参考文档&#xff1a;CentOS7 安装Seleniumchromechromedriverjava_远方丿的博客-CSD…...

【无公网IP】在公网环境下Windows远程桌面Ubuntu 18.04

【无公网IP】在公网环境下Windows远程桌面Ubuntu 18.04 文章目录 *【无*公网IP】在公网环境下Windows远程桌面Ubuntu 18.04一、 同个局域网内远程桌面Ubuntu1. 更新软件仓库2. 安装支持包3. 安装XFCE4桌面环境4. 安装XRDP5. 环境设置5.1 XFCE桌面配置5.2 在配置文件中&#xff…...

Java“牵手拼多多商品详情数据采集方法,拼多多API接口申请指南

拼多多详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在电商平台的开发中&#xff0c;详情接口API是非常常用的 API&#xff0c;因此本文将详细介绍详情接口 API 的使用。 一、拼…...

Leetcode-每日一题【剑指 Offer 15. 二进制中1的个数】

题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...