【flutter上传图片】

1.使用multi_image_picker插件

dart 复制代码
//选择图片
openPhotoSelect(int maxImages,context) async {
    try {
      List<Asset> images = await MultiImagePicker.pickImages(
        maxImages: maxImages - state.selectImageList.length,
        enableCamera: true,
        cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
        materialOptions: MaterialOptions(
          actionBarTitle: "图片选择",
          allViewTitle: "所有图片",
          useDetailsView: true,
          selectCircleStrokeColor: "#4dc8b6",
          selectionLimitReachedText: "最多选择$maxImages张图片",
        ),
      );

      state.selectImageList.addAll(file);
      state.publishType = 1;
      update();
    } on Exception catch (e) {
      print(e);
    }
  }

//上传图片
  Future<bool> uploadImagesData() async {
    state.imageVideoParamList.clear();
    ByteData byteData;
    List<int> imageData;
    MultipartFile multipartFile;
    FormData formData;
    Response response;
    Dio dio = Dio();

    if(state.selectImageList.length > 0){
      for (int i = 0; i < state.selectImageList.length; i++) {
        Asset asset = state.selectImageList[i];
        byteData = await asset.getByteData();
        imageData = byteData.buffer.asUint8List();
        multipartFile =
            MultipartFile.fromBytes(imageData, filename: "${asset.name}");
        formData = FormData.fromMap({
          "android": "1",
          "file": multipartFile,
        });
        
        multipartFile =
            MultipartFile.fromBytes(file.path, filename: "${asset.name}");
        formData = FormData.fromMap({
          "android": "1",
          "file": multipartFile,
        });

        response = await dio.post('${MyApi.UPLOAD_FILE}', data: formData);
        if (response.statusCode == 200 && response.data['code'] == 200) {
          state.uploadIndex = i + 1;
          if (i == 0) {
            state.image = response.data['data'] /*+
                '?Size=${asset.originalWidth}x${asset.originalHeight}'*/;

            state.imageVideoParamList.add(
                {
                  'type':'P',
                  'url':'${response.data['data'] +
                      '?Size=${asset.originalWidth}x${asset.originalHeight}'}'
                }
            );

            update();
          } else {
            state.image = "${state.image};" +
                response.data['data'] +
                '?Size=${asset.originalWidth}x${asset.originalHeight}';
            state.imageVideoParamList.add(
                {
                  'type':'P',
                  'url':'${response.data['data'] +
                      '?Size=${asset.originalWidth}x${asset.originalHeight}'}'
                });
            update();
          }
        }
      }
      // 图片上传结束
      if (state.selectImageList.length > state.uploadIndex) {
        // 部分图片上传失败
        state.uploadIndex = null;
        return false;
      }
    }
    return true;
  }

2.使用wechat_assets_picker插件

dart 复制代码
// 打开图片选择
  openPhotoSelect(int maxImages,context) async {
    try {
      List<AssetEntity> images = await AssetPicker.pickAssets(
          context,
          maxAssets: maxImages - state.selectImageList.length
      );
      images.forEach((element) async {
        File file = await element.file;
        state.selectImageList.add(file);
      });
      state.publishType = 1;
      update();
    } on Exception catch (e) {
      print(e);
    }
  }

//上传图片
  Future<bool> uploadImagesData() async {
    state.imageVideoParamList.clear();
    ByteData byteData;
    List<int> imageData;
    MultipartFile multipartFile;
    FormData formData;
    Response response;
    Dio dio = Dio();

    if(state.selectImageList.length > 0){
      for (int i = 0; i < state.selectImageList.length; i++) {
        File file = state.selectImageList[i];
        String imageName = file.path.substring(file.path.lastIndexOf("/") + 1, file.path.length);
        multipartFile =
            MultipartFile.fromFileSync(file.path, filename: "$imageName");
        formData = FormData.fromMap({
          "android": "1",
          "file": multipartFile,
        });

        response = await dio.post('${MyApi.UPLOAD_FILE}', data: formData);
        if (response.statusCode == 200 && response.data['code'] == 200) {
          state.uploadIndex = i + 1;
          if (i == 0) {
            state.image = response.data['data'];

            state.imageVideoParamList.add(
                {
                  'type':'P',
                  'url':'${response.data['data']}'
                }
            );

            update();
          } else {
            state.image = "${state.image};" +
                response.data['data'];

            state.imageVideoParamList.add(
                {
                  'type':'P',
                  'url':'${response.data['data']}'
                });
            update();
          }
        }
      }
      // 图片上传结束
      if (state.selectImageList.length > state.uploadIndex) {
        // 部分图片上传失败
        state.uploadIndex = null;
        return false;
      }
    }

    return true;
  }

选择视频

dart 复制代码
/// 视频选择
  void openVideoSelect(BuildContext context) async {
    PickedFile pickedFile =
    await ImagePicker().getVideo(source: ImageSource.gallery);
    File videoFile = File(pickedFile.path);
    //state.videoPath = videoFile.path;
    update();
    VideoPlayerController _controller = VideoPlayerController.file(videoFile);
    _controller.initialize().then((_) async {
      Duration duration = _controller.value.duration;
      if (duration.inSeconds > 60) {
        esLoadingToast('发布视频长度不能大于1分钟');
      } else {
        // 解码视频
        Loading.showLoading(context);
       bool end = await openVideoEncode(videoFile.path);
       if(end){
         Loading.hideLoading(context);
       }
      }
    });
  }
相关推荐
孤鸿玉16 小时前
Fluter InteractiveViewer 与ScrollView滑动冲突问题解决
flutter
叽哥1 天前
Flutter Riverpod上手指南
android·flutter·ios
BG2 天前
Flutter 简仿Excel表格组件介绍
flutter
zhangmeng2 天前
FlutterBoost在iOS26真机运行崩溃问题
flutter·app·swift
恋猫de小郭2 天前
对于普通程序员来说 AI 是什么?AI 究竟用的是什么?
前端·flutter·ai编程
卡尔特斯2 天前
Flutter A GlobalKey was used multipletimes inside one widget'schild list.The ...
flutter
w_y_fan2 天前
Flutter 滚动组件总结
前端·flutter
醉过才知酒浓2 天前
Flutter Getx 的页面传参
flutter
火柴就是我3 天前
flutter 之真手势冲突处理
android·flutter
Speed1233 天前
`mockito` 的核心“打桩”规则
flutter·dart