当前位置: 首页 > article >正文

Flutter Web 选取并上传图片

选取图片

  /// 选取图片
  void pickImage() async {
    final input = html.FileUploadInputElement();
    // 单选
    input.multiple = false;
    input.accept = 'image/*';

    // 显示文件选择对话框
    html.document.body?.append(input);
    input.click();

    await input.onChange.first;

    // 获取选中的文件列表
    final files = input.files;
    if (files?.first.name.isEmpty == true) {
      return;
    }
    final file = files!.first;
    if (!await beforeUpload(file)) {
      input.remove();
      return;
    }

    final reader = html.FileReader();
    reader.onLoadEnd.listen((e) {
      final result = reader.result as Uint8List;
      uploadImage(result, file);
    });
    reader.readAsArrayBuffer(file);
  }

校验图片合法性

  /// 对上传的文件进行校验
  Future<bool> beforeUpload(html.File file) async {
    final size = await file.size;
    bool isSize = size / 1024 / 1024 < 15;
    if (!isSize) {
      print("超过15M限制,不允许上传~");
      return false;
    }
    // 添加对文件后缀名的限制
    final suffix =
        file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();
    final isSuffixByJpgOrPng =
        (suffix == 'jpg' || suffix == 'jpeg' || suffix == 'png');
    final isJpgOrPng = file.type == 'image/jpg' ||
        file.type == 'image/jpeg' ||
        file.type == 'image/png';

    if (!isSuffixByJpgOrPng || !isJpgOrPng) {
      print("只能上传JPG、JPEG、PNG格式的图片~'");
      return false;
    }
    return true;
  }

使用http上传图片

  /// 上传文件
  void uploadImage(Uint8List data, html.File file) async {
    try {
      var request = http.MultipartRequest(
          'POST', Uri.parse('https://cdn.server.com/api/upload'));
      request.files.add(http.MultipartFile.fromBytes('file', data,
          filename: file.name, contentType: MediaType.parse(file.type)));

      final response = await request.send();
      if (response.statusCode == 200) {
        final jsonStr = await response.stream.bytesToString();
        final jsonData = jsonDecode(jsonStr);
        /// TODO 处理请求成功之后的数据
      }
    } catch (e) {
      print("upload error -> $e");
    }
  }

http://www.kler.cn/a/487905.html

相关文章:

  • 在ubuntu下对NFS做性能测试
  • 【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述
  • [java基础-集合篇]优先队列PriorityQueue结构与源码解析
  • 【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)
  • SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门
  • Web基础之什么是HTTP协议
  • JavaSE——网络编程
  • Python基于YOLOv8和OpenCV实现车道线和车辆检测
  • 有机物谱图信息的速查技巧有哪些?
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue奶茶点单系统(高质量源码,提供文档,免费部署到本地)
  • vue3+element-plus暗黑模式切换动画圆弧过渡
  • linux nginx 安装后,发现SSL模块未安装,如何处理?
  • Mumu模拟器和Frida
  • 【读点论文】DepGraph: Towards Any Structural Pruning通用的结构化剪枝框架,处理结构化剪枝的图依赖问题
  • 20250109使用M6000显卡在Ubuntu20.04.6下跑whisper来识别中英文字幕
  • Vue 2 提取可复用 Footer 组件
  • L1G5000 XTuner 微调个人小助手认知
  • 【Vue.js 组件化】高效组件管理与自动化实践指南
  • vs2022开发.net窗体应用开发环境安装配置以及程序发布详细教程
  • STM32 : PWM 基本结构