【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);
       }
      }
    });
  }
相关推荐
环信即时通讯云32 分钟前
实战|使用环信Flutter SDK构建鸿蒙HarmonyOS应用及推送配置
flutter·华为·harmonyos
亚洲小炫风4 小时前
Melos 发布pub.dev
flutter·pub.dev
东东爱编码4 小时前
一路磕磕绊绊解决flutter doctor 报错CocoaPods not installed
flutter·xcode·cocoapods
louisgeek5 小时前
Flutter 简介
flutter
JarvanMo17 小时前
关于Flutter架构的小小探讨
前端·flutter
顾林海17 小时前
Flutter 图标和按钮组件
android·开发语言·前端·flutter·面试
yzwdzkn18 小时前
解决Flutter 2.10.5在升级Xcode 16后的各种报错
flutter·macos·xcode
亚洲小炫风21 小时前
flutter json解析增强
flutter·json·json兼容格式
SY.ZHOU21 小时前
Flutter 与原生通信
android·flutter·ios