flutter minio

背景

前端 经常需要上传文件 图片 视频 等等 到后端服务器, 如果到自己服务器 一般会有安全隐患。也不方便管理这些文件。 如果要想使用一些骚操作 比如 按照前端请求生成不同分辨率的图片,那就有点不太方便了。

这里介绍以下 minio ,(MinIO | 企业级、高性能对象存储)有点类似 腾讯云 阿里云的 对象存储:头衔有很多 总结 技术性能强悍 可以使用的姿势比较多:

++这里只要介绍下从 Flutter 上传图片的 和 视频 的操作:++

minio 搭建

官网:MinIO | 高性能, Kubernetes 原生对象存储

下载解压 :

我这里编写了脚本 run.bat

复制代码
# 设置用户名
set MINIO_ROOT_USER=admin
# 设置密码(8位)
set MINIO_ROOT_PASSWORD=12345678
minio.exe server --address :9000 --console-address :9001 D:\MinIO_FileDatum
  1. 新建txt 文档
  2. 脚本粘贴进去 保存退出
  3. 修改文件名和后缀

然后点击运行:

按照上面的 ip 和 端口 和密码 之后登录设置仓库

Flutter中使用Minio

因为我 flutter SDK 版本比较高 所以使用的是: pubspec.yaml

复制代码
# minio 文件系统
minio_new: ^1.0.2

这里我是 使用 来录制视频的:所以得到的是 AssetEntity

复制代码
wechat_camera_picker: ^3.8.0
  • 图片上传不带进度

    复制代码
    //视频生成的缩略图
    String? thumbnailPath = await VideoThumbnail.thumbnailFile(
      video: file.path,
    );
    print("------thumbnailPath:  $thumbnailPath");
    
    final minio = Minio(
      endPoint: '172.61.10.9',
      port: 9000,
      accessKey: AppMinio().accessKey,
      secretKey: AppMinio().secretKey,
      useSSL: false,
    );
    
    int index = thumbnailPath!.lastIndexOf('/');
    //图片的文件名
    String pictureName = thumbnailPath!.substring(index + 1);
    
    //存图片
    String res =
        await minio.fPutObject('vidoes', pictureName, thumbnailPath!);
    print('minio  ------>res :${res}');

完整函数代码:

复制代码
void _videoThumbnail(AssetEntity entity) async {
  File? file = await entity.file;
  if (file != null) {
    // String thumbnailPath = file.path;
    // thumbnailPath =
    //     thumbnailPath.substring(0, thumbnailPath.length - 3) + "png";
    // File photoPath = File(thumbnailPath);
    //
    // var pathBool = await photoPath.exists();
    String? thumbnailPath = await VideoThumbnail.thumbnailFile(
      video: file.path,
    );
    print("------thumbnailPath:  $thumbnailPath");

    final minio = Minio(
      endPoint: '172.61.10.9',
      port: 9000,
      accessKey: AppMinio().accessKey,
      secretKey: AppMinio().secretKey,
      useSSL: false,
    );

    int index = thumbnailPath!.lastIndexOf('/');
    String pictureName = thumbnailPath!.substring(index + 1);

    //存图片
    String res =
        await minio.fPutObject('vidoes', pictureName, thumbnailPath!);
    print('minio  ------>res :${res}');

    //读文件
    // final stream = await minio.getObject('vidoes', res);
    // Directory dir = await getApplicationSupportDirectory();
    // String path = '${dir.path}/image/abc.png';
    // await stream.pipe(File(path).openWrite());

    int index2 = file.path.lastIndexOf('/');
    String videoName = file.path.substring(index2 + 1);

    print("pictureName:${pictureName}");

    print("videoName:${videoName}");

    int fileSize = await file.length();

    //存 视频
    Stream<List<int>> inputIntList = file.openRead();
    Stream<Uint8List> inputStream = inputIntList
        .asyncMap<Uint8List>((event) => Uint8List.fromList(event));
    String res1 = await minio.putObject(
      'vidoes',
      videoName,
      inputStream,
      onProgress: (int progress) {
        print("进度 onProgress: ${progress / fileSize}");
      },
    );
    print('minio  ------>res :${res1}');
  }
}
相关推荐
心中有国也有家3 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos
千逐687 小时前
React Native 性能优化深度解析:从原理到实战
flutter·华为·鸿蒙
帅次9 小时前
Android 高级工程师面试:Flutter Widget 体系 近1年高频追问 20 题
android·flutter·面试·element·widget·setstate·renderobject
浮江雾13 小时前
Flutter第四节------核心概念学习笔记:从基础语法到异步编程
linux·服务器·开发语言·笔记·flutter·入门·基础
心中有国也有家14 小时前
AtomGit Flutter 鸿蒙客户端:Flutter 鸿蒙应用的错误处理与优雅降级策略
学习·flutter·华为·harmonyos
心中有国也有家1 天前
AtomGit Flutter 鸿蒙客户端: ChangeNotifier 模式
学习·flutter·华为·harmonyos
浮江雾1 天前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
又菜又爱coding1 天前
Flutter Android 无线调试No supported devices connected
flutter
心中有国也有家2 天前
AtomGit Flutter 鸿蒙客户端:初始化流水线
学习·flutter·华为·harmonyos
ZZZMMM.zip2 天前
基于鸿蒙HarmonyOS NEXT开发AI英语口语应用:智能口语练习新体验与鸿蒙Flutter框架跨端实
人工智能·flutter·华为·harmonyos·鸿蒙·鸿蒙系统