【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);
       }
      }
    });
  }
相关推荐
m0_7381858235 分钟前
Flutter 鸿蒙化实战:flutter_nfc_kit 适配 OpenHarmony,NFC 读写一步到位
flutter·华为·harmonyos·鸿蒙
恋猫de小郭1 小时前
KMP 又改了编译流程, Separate Compilation 禁止了 `commonMain` 的依赖穿透
android·前端·flutter
m0_738185822 小时前
Flutter 鸿蒙化实战:flutter_quill 适配 OpenHarmony,富文本编辑器
flutter·华为·harmonyos·鸿蒙
m0_738185822 小时前
Flutter 鸿蒙化实战:flutter_quick_video_encoder 适配 OpenHarmony,逐帧编码视频
flutter·华为·音视频·harmonyos·鸿蒙
blanks202018 小时前
如何查看 drift 在 本机的 sqlite 文件路径
flutter
m0_738185821 天前
Flutter 鸿蒙化实战:flutter_iot_wifi 适配 OpenHarmony,IoT 设备 WiFi 配网
物联网·flutter·华为·harmonyos·鸿蒙
律宏阔2 天前
Flutter Riverpod 3:统一打印 Provider 错误与自动重试日志
前端·flutter
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_exif_plugin 适配 OpenHarmony,图片 EXIF 读写
flutter·华为·harmonyos·鸿蒙
恋猫de小郭2 天前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter