Flutter 相机、相册、压缩、上传(image_picker + flutter_image_compress + dio)

6 篇文章 2 订阅
5 篇文章 0 订阅
  1.   Flutter开发需要做一个图片上传功能(image_picker)。
    
      showPicker() {
        FocusScope.of(context).requestFocus(FocusNode());
        //底部弹出
        showModalBottomSheet(
            context: context,
            builder: (BuildContext con) => Container(
                  height: 160,
                  padding: EdgeInsets.all(20),
                  color: Colors.white,
                  child: Column(
                    children: [createItem(true, "拍照"), createItem(false, "相册")],
                  ),
                ));
      }
    
    //创建item
      Widget createItem(bool state, String name) {
        return GestureDetector(
            onTap: () {
              openPicker(state);
            },
            child: ListTile(
              leading: Icon(state ? Icons.camera : Icons.image),
              title: Text(name),
            ));
      }
    
      openPicker(bool state) async {
        Navigator.pop(context);
        var picker = ImagePicker();
        XFile photo = await picker.pickImage(
            source: state ? ImageSource.camera : ImageSource.gallery);
        if (photo != null) {
          var imageCompressAndGetFile =
              await ImageCompressUtil.imageCompressAndGetFile(File(photo.path));
    
          var formData = FormData.fromMap({
            'file': await MultipartFile.fromFile(imageCompressAndGetFile.path,
                filename: photo.name)
          });
          uploadFile(formData);
        }
      }
    
      uploadFile(formData) {
        HttpManager.getInstance().uploadImage(formData,
            (Map<String, dynamic> data) {
          if (data["code"] == 0) {
            String url = data["data"];
            switchOcrType(url);
            setState(() {
              imageUrl = url;
            });
          }
        });
      }
  2. 图片压缩(flutter_image_compress)
      static Future<File> imageCompressAndGetFile(File file) async {
        if (file.lengthSync() < 200 * 1024) {
          return file;
        }
        var quality = 100;
        if (file.lengthSync() > 4 * 1024 * 1024) {
          quality = 50;
        } else if (file.lengthSync() > 2 * 1024 * 1024) {
          quality = 60;
        } else if (file.lengthSync() > 1 * 1024 * 1024) {
          quality = 70;
        } else if (file.lengthSync() > 0.5 * 1024 * 1024) {
          quality = 80;
        } else if (file.lengthSync() > 0.25 * 1024 * 1024) {
          quality = 90;
        }
        var dir = await path_provider.getTemporaryDirectory();
        var targetPath = dir.absolute.path +"/"+DateTime.now().millisecondsSinceEpoch.toString()+ ".jpg";
    
        var result = await FlutterImageCompress.compressAndGetFile(
          file.absolute.path,
          targetPath,
          minWidth: 600,
          quality: quality,
          rotate: 0,
        );
    
        return result;
      }
  3. 图片上传(dio)
    
      uploadImage(FormData formData, Function successCallBack) async {
        EasyLoading.show(status: '上传中...');
        try {
          var response = await _dio.post(UrlPath.UPLOADURL, data: formData);
          successCallBack(response.data);
          EasyLoading.dismiss();
        } catch (e) {
          EasyLoading.dismiss();
        }
      }

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值