之前发过一篇上传多张图片的博客,那个是自己实现的,但是是一张一张上传最后页面上显示出来所有上传的图片,这篇文章介绍一下一次性选择多张图片并上传

首先引入依赖:multi_image_picker,这个插件可以选择多张图片,插件地址https://pub.flutter-io.cn/packages/multi_image_picker

然后画个小页面

import 'package:flutter/material.dart';
import 'dart:io';
//ByteData这里需要引入dart:typed_data文件,引入service.dart的话app里可以检索到文件个数,但是传递到后台一直是null,时间紧迫我也没抓包看是咋回事儿先这么用吧
import 'dart:typed_data';
import 'package:dio/dio.dart';
//MediaType用
import 'package:http_parser/http_parser.dart';
import 'package:multi_image_picker/multi_image_picker.dart';class TestPage extends StatefulWidget {final arguments;TestPage({Key key, this.arguments}) : super(key : key);_TestPageState createState() => _TestPageState(this.arguments);
}class _TestPageState extends State<TestPage> {final arguments;_TestPageState(this.arguments);//上传图片用ScrollController _imgController = new ScrollController();List<Asset> _img = new List<Asset>();@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(leading: InkWell(child: Icon(Icons.keyboard_return),onTap: (){Navigator.pop(context);},),title: Text("上传照片"),),body: Padding(padding: EdgeInsets.all(10),child: Column(children: [Row(children: <Widget>[this._img == null ? Expanded(flex: 1,child: Text(""),) : Expanded(flex: 1,child: Container(width: double.infinity,height: 50,child: ListView.builder(controller: _imgController,shrinkWrap: true,scrollDirection: Axis.horizontal,itemCount: this._img.length,itemBuilder: (context, index){return Container(width: 50,height: 50,margin: EdgeInsets.only(right: 10),decoration: BoxDecoration(borderRadius: BorderRadius.circular(4.0),border: Border.all(style: BorderStyle.solid,color: Colors.black26,)),child: AssetThumb(asset: this._img[index],width: 50,height: 50,),);},),),),InkWell(child: Container(width: 50,height: 50,margin: EdgeInsets.only(right: 10),decoration: BoxDecoration(borderRadius: BorderRadius.circular(4.0),border: Border.all(style: BorderStyle.solid,color: Colors.black26,)),child: Center(child: Icon(Icons.camera_alt),),),onTap: _openGallerySystem ,)],),Container(width: double.infinity,height: 80,child: RaisedButton(color: Colors.blue,child: Text("提交",style: TextStyle(color: Colors.white),),onPressed: () {_submitData();},),),],)),);}//选择文件上传void _openGallerySystem () async {List<Asset> resultList = List<Asset>();resultList = await MultiImagePicker.pickImages(//最多选择几张照片maxImages: 9,//是否可以拍照enableCamera: true,selectedAssets: _img,materialOptions:MaterialOptions(startInAllView:true,allViewTitle:'所有照片',actionBarColor:'#2196F3',//未选择图片时提示textOnNothingSelected:'没有选择照片',//选择图片超过限制弹出提示selectionLimitReachedText: "最多选择9张照片"),);if (!mounted) return;setState(() {_img = resultList;});}//提交数据void _submitData () async {//处理图片List<MultipartFile> imageList = new List<MultipartFile>();for (Asset asset in _img) {//将图片转为二进制数据ByteData byteData = await asset.getByteData();List<int> imageData = byteData.buffer.asUint8List();MultipartFile multipartFile = new MultipartFile.fromBytes(imageData,//这个字段要有,否则后端接收为nullfilename: 'load_image',//请求contentType,设置一下,不设置的话默认的是application/octet/stream,后台可以接收到数据,但上传后是.octet-stream文件contentType: MediaType("image", "jpg"),);imageList.add(multipartFile);}FormData formData = new FormData.fromMap({//后端要用multipartFiles接收参数,否则为null"multipartFiles" : imageList});var res = await Dio().post("你的URL", data: formData);//后面随意发挥}
}

选择图片截图:这个插件选择图片后还有个加载过程,挺好的(按钮有点丑,凑合看吧,哈哈哈)

后端方法:SpringBoot

@RequestMapping(value = "xxx", method = RequestMethod.POST)//一定要有这个注解@RequestParam("multipartFiles[]"),否则接收不到参数public String testupload (@RequestParam("multipartFiles[]") List<MultipartFile> multipartFiles) throws IOException {if (multipartFiles.size() > 0) {for (MultipartFile multipartFile : multipartFiles) {//上传图片BufferedImage image = ImageIO.read(multipartFile.getInputStream());System.out.println(image);String extention ="."+ multipartFile.getContentType().split("/")[1];UUID uuid = UUID.randomUUID();String path = "D:/haha/" + uuid+ extention;File outputFile = new File(path);ImageIO.write(image, "jpg", outputFile);}}return "ok";}

上传后截图:

中间还有个小波折,第一次测试程序的时候程序报了个错:The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector

开始以为是图片的过大,但是我已经在项目中设置了

spring.servlet.multipart.max-file-size = 100MB

spring.servlet.multipart.max-request-size=100MB

感觉不应该是图片尺寸的问题,

后来网上找了办法说是springboot中的内置tomcat服务器限定了Httppost的最大size

解决办法:在properties中添加如下配置,修改该内置服务器的对HttpPost数据的大小

server.max-http-header-size=102400000

server.tomcat.max-http-post-size=102400000

参考链接:https://blog.csdn.net/Draught_Bear/article/details/105601473

Flutter选择多张图片上传相关推荐

  1. android h5 多图上传源码,JS移动端/H5同时选择多张图片上传并使用canvas压缩图片...

    最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候 ...

  2. 多组input文件,每组 multiple选择多张图片上传可增删其中任意一张图片,用formData对象实现(ajax,sync: false同步)

    input .multiple选择多张图片时,需要删除其中的一张图片怎么做,大家都知道 input 中的文件是不能删除和更改的,只能清空,这里我的做法是 定义一个对象储存器把需要的文件存在储存器中 f ...

  3. 多组input文件,每组 multiple选择多张图片上传可增删其中任意一张图片,用formData对象实现;(ajax做异步,自己做延时同步)

    input .multiple选择多张图片时,需要删除其中的一张图片怎么做,大家都知道 input 中的文件是不能删除和更改的,只能清空,这里我的做法是 定义一个对象储存器把需要的文件存在储存器中 f ...

  4. 【Android源码解析】选择多张图片上传多图预览

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/47731439 最近做了选择多图并且上传服务器,在网上找了一些 ...

  5. 安卓选择多张图片上传_微信7.0.5更新!安卓客户端领先ios发布,新增多项实用功能...

    微信前段时间更新频繁,大大小小的更新,使得微信的UI设计整体风格都变得更加简洁起来,还新增了不少功能,非常实用.由于更新的功能比较多,很多人表示新功能还没完全摸透,但是微信可不给你更多时间,最新消息显 ...

  6. 仿微信图片选择及多张图片上传

    最近做项目涉及到图片上传这块,多张图片上传是用xutils实现的,图片选择.预览是参考了微信图片选择的demo,先上图: 这是网上参考了仿微信图片上传实现的,这里就不多讲了,文章底部有下载链接,下面介 ...

  7. php mysql上传多张图片_PHP实现一次性多张图片上传功能

    原标题:PHP实现一次性多张图片上传功能 最近遇到一个需求,就是多张图片上传,按住Ctrl键能选择多张图片一次性上传,上传成功后数据库保存图片的路径及图片原来的文件名.该功能一般在比较成熟的内容编辑器 ...

  8. 调用android的拍照或本地相册选取再实现相片上传服务器,Android调用系统相机、本地相册上传图片(头像上传(裁剪)、多张图片上传)...

    开发中基本上都会有头像上传的功能,有的app还需要多张图片同时上传,下面简单将头像上传以及多张图片上传功能整理一下.图片选择仿照微信选择图片的界面.[参考] 多图片选择器 !!!推荐一个动态权限请求的 ...

  9. asp.net中使用Uploadify插件实现多张图片上传,上传后可显示缩略图、删除图片

    本文为原创文章,欢迎转载!转载时请注明出处:http://blog.csdn.net/c_yang13 一.准备工具 1.jquery,我使用的是jquery-1.11.3.min.js 2.uplo ...

最新文章

  1. (0042) iOS 开发之iOS10.3新特性:如何动态更换APP图标
  2. speedtorch 加速神经网络
  3. ObjectInputStreamObjectOutputStream工具类
  4. list删除某个元素_Redis对象——列表(List)
  5. iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Con
  6. matlab中矩阵怎么敲_Ansys刚度(质量、阻尼)矩阵的提取(part 1)
  7. 华为公开折叠屏新专利:Mate X2有望首发搭载
  8. 贪心算法的python实现
  9. “不做信奥比赛,不做等级考试”的童心制物,是如何在 STEAM 教育突出重围?
  10. Windows server 2016 / Windows 10关于域管理员帐号权限不足的问题
  11. TensorFlow by Google Machine Learning Foundations: Ep #8 - Tokenization for Natural Language Process
  12. chrome中文本框样式问题
  13. struts教程笔记5
  14. java mocked_java – 使mocked方法返回传递给它的参数
  15. Linux 终端命令 --常用命令一
  16. C++字符串常用输入方法
  17. 马哥教育大数据专家:深入解读大数据的就业前景
  18. 最新GLPI--优秀的linux开源IT资产管理系统
  19. 如何搭建一个react项目?
  20. sdkman 管理开发中使用的sdk

热门文章

  1. vue echarts 中国地图实现用户分布
  2. 南京沁恒推出的国产 M3 架构芯片与意法半导体 M3 芯片对比
  3. 微信小程序优惠券到期提醒功能设定指引
  4. 2020淘宝平台搜索规则变化和调整,搜索转化率如何提升
  5. 计算机主机灯,谁能给我说下电脑机箱灯怎么关
  6. 简述组装计算机硬件流程,计算机硬件组装的步骤有哪些?
  7. 工业软件国产化路在何方?INTEWELL助力民族工业落地生“根”
  8. cad服务器手动改自动,手动挡改为自动挡,只需加装这“神器”老司机3000元就能...
  9. CE简单修改演示(植物大战僵尸)
  10. 千元机PK苹果iphone