之前做过了一个app端上传视频到后端 视频过大的话 需要将视频切开 分片传到后台 后台在自己合起来 dio上没看到对应的方法 只能自己手写了

主要是几个步骤

1.选择视频

分为录制视频跟手机相册选择两种

录制视频:

可以先用 permission_handler 这个插件做手机权限判断

再使用 image_picker插件了录制视频 此处设置了最长60秒

Future _getVideo() async {final PickedFile file = await _picker.getVideo( source: ImageSource.camera, maxDuration: const Duration(seconds:60));videoFile = File(file.path);await _playVideo(file.path);
}

选择手机上的视频:

使用的是image_pickers插件选择的视频 image_picker与image_pickers略有不同 是两个插件 还有一个image_picker_saver 用来做保存图片 在兼容方面好一些

此处我设置了只能从相册中选一个视频

Future _choseVideo() async{List<Media> _listVideoPaths = await ImagePickers.pickerPaths(galleryMode: GalleryMode.video,selectCount: 1,);_playVideo(_listVideoPaths[0].path);
}

_playVideo()是我自己写的一个判断跟跳转到视频播放的一个方法

2.使用flutter_compress插件压缩视频

MediaInfo _compressedVideoInfo = MediaInfo(path: '');//压缩视频
Future<void> runFlutterVideoCompressMethods(File videoFile) async {final mediaInfo = await VideoCompress.compressVideo(videoFile.path,quality: VideoQuality.MediumQuality, deleteOrigin: false,);setState(() {_compressedVideoInfo = mediaInfo;});
}

3.使用lengthSync获取文件进制流 之后定义每一块的大小

file = File(_compressedVideoInfo.path);
var sfile = await file.open();
var x = 0;
var fileSize = file.lengthSync();
var chunkSize = 1000000;
var val;

4.循环使用httpClient.postUrl 将每一块发送给后台 判断最后一块 给后台标识 让后台根据标识合成视频

while (x < fileSize) {var duotuLoad = BotToast.showCustomLoading(clickClose: false,crossPage: false,backButtonBehavior:BackButtonBehavior.ignore,toastBuilder:(_){return _loadingWidget(x,fileSize);},);setState(() {process = x;});var isLast = fileSize - x >= chunkSize  ? 'no' : 'yes';var httpClient = new HttpClient();var url = "http://www.xxxx.cn/app/appApi.php?isLast="+isLast+"&name="+name+"&phone="+phone+"&proportion="+kuangb.toString();var request = await httpClient.postUrl(Uri.parse(url));var _len = fileSize - x >= chunkSize  ? chunkSize : fileSize - x;val = sfile.readSync(_len).toList();x = x + _len;// 加入http发送缓冲区request.add(val);// 立即发送并清空缓冲区await request.flush();HttpClientResponse response = await request.close();String responseBody = await response.transform(utf8.decoder).join();duotuLoad();if( json.decode(responseBody)['status'] == 1 ){// 文件发送完成await sfile.close();toast('上传完成');Navigator.pop(context,json.decode(responseBody)['data']['finalpath']+'|||'+_compressedVideoInfo.path,);}
}

声明的duotuLoad变量是用 bot_toast插件做了个蒙层 再执行duotuLoad()可以关闭蒙层 不需要的话可以删掉

有一个问题还没解决 蒙层里的进度条没法做到实时更新 我是做成了先关闭蒙层再打开 实际上可以解决这个问题

全部完成前最好使用蒙层禁止用户操作

flutter 视频选择之后并分片上传相关推荐

  1. iOS 利用AFNetworking实现大文件分片上传

    概述 一说到文件上传,想必大家都并不陌生,更何况是利用AFNetworking(PS:后期统称AF)来做,那更是小菜一碟.比如开发中常见的场景:头像上传,九宫格图片上传...等等,这些场景无一不使用到 ...

  2. thinkphp6+webuploader实现大文件(视频)分片上传/本地保存或上传OSS

    thinkPHP6+webuploader分片上传大视频的解决方案: ①能解决视频太大,1G.2G直传服务器压力过大 ②部分追求完美的人不发接受直传,那只能分片上传 ③分片上传是我找到的比较合理的解决 ...

  3. SpringBoot整合FFmpeg进行视频分片上传(Linux)

    SpringBoot整合FFmpeg进行视频分片上传 分片上传的核心思路: 分片上传到意义: 分片上传的原理: 准备工作: 一:下载.解压 代码展示: pom文件 yml配置 工具类 controll ...

  4. html上传视频文件前端显示,文件分片上传之前端文件分片

    分片上传的原理就是在前端将文件分片,然后一片一片的传给服务端,由服务端对分片的文件进行合并,从而完成大文件的上传.分片上传可以解决文件上传过程中超时.传输中断造成的上传失败,而且一旦上传失败后,已经上 ...

  5. html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)

    上传视频到服务器 1.引入js插件: 2.html页面如图: 上传视频: 上传视频 支持AVI.wma.rmvb.rm.flash.mp4.mid.3GP等格式 3.js代码 $(function ( ...

  6. java视频文件分片上传

    Java视频分块上传 环境:springboot2.5.6+jdk1.8 1.在启动类中配置静态资源映射 springboot项目中配置了静态资源映射之后就启动项目之后就可以通过地址访问了 @Spri ...

  7. PHP上传大文件视频到阿里云oss分片上传

    下载阿里云oss的SDK composer require aliyuncs/oss-sdk-php 上传视频,我用的是分片上传,其实阿里云的文档已经写得很清楚了,不过这是当我把上传的功能写出来后才这 ...

  8. 抖音开放平台-视频切片-视频分片上传-不合法的参数ID-不合法的对象ID

    问题描述 1.最近遇到个问题,做业务需要管理几个抖音账号,用抖音开放平台做分片上传视频,多次返回不合法参数id,提交工单之后给的回复没有任何参考价值. 2.例如视频文件按15M进行切片,调用分片上传初 ...

  9. 大文件分片上传,断点续传,秒传 实现

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

最新文章

  1. 字节跳动 录屏功能_一周盘点:Instagram打通视频购物功能 公开叫板TikTok;字节跳动要大力布局跨境出口电商?...
  2. 在做移动端开发的时候,一些应该知道的知识
  3. java基础面向对象_Java基础面向对象
  4. C语言以下4个选项中,不能看作一条语句的是?
  5. hdu 2191 多重背包入门
  6. php odbc连接数据库命名实例,一个用mysql_odbc和php写的serach数据库程序_php实例
  7. 数据库设置为php5.3,php5.3不能连接mssql数据库的解决方法,php5.3mssql_PHP教程
  8. AcWing 839. 模拟堆
  9. ASP入门基础教程-VBScript概述及基本元素
  10. 搭建steam游戏服务器
  11. Java之JDBC安装、使用详解(2021最新!)
  12. 用Unity3D实现打飞碟游戏
  13. 哈希表、哈希桶(C++实现)
  14. MySQL:Can't create test file XXX.lowe-test
  15. php自定义函数全局声明,【phpcms-v9】phpcms-v9中自定义全局函数文件:extention.func.php...
  16. 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)
  17. 【计算机视觉】图像拼接技术
  18. 58同城智能推荐系统的演进与实践(转)
  19. Cocos2d-x 3.0final 终结者系列教程01-无论是从cocos2d-x2.x升级到版本cocos2d-x3.x
  20. C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)

热门文章

  1. Linux计划任务at和cron命令的使用
  2. I/O设备和设备控制器
  3. html弹窗隐藏,js弹窗window.open 隐藏地址栏的问题location
  4. re文件管理免root中文版,re管理器免root版本
  5. CA-CFAR代码实现
  6. Android 基于AccessibilityService智能安装Apk 仿 豌豆荚
  7. OSChina 周日乱弹 —— 红领巾聚会
  8. HashMap的工作原理和底层实现(二)红黑树的左旋、右旋
  9. 宿主机kernel识别kvm-vcpu线程的一种方法
  10. 云服务器标准方式登录Linux