实现Dart版本对象存储(COS)插件
前言
在 Flutter Web 在《一起漫部》的性能优化探索与实践 一文中,
在做加载优化时需要实现资源文件cdn化,意味着要将资源文件上传到腾讯的COS或者阿里的OSS这样的第三方对象存储服务器。 目前公司使用的是腾讯的对象存储(COS),原本想用官方提供的SDK去实现资源上传功能,但是官方并没有提供Dart版本的SDK, 去pub.dev
搜了下关于cos的相关插件,也没有找到功能相对完善的插件,于是便打算手写一个Dart版本对象存储(COS)插件。
简介
在官方提供的API功能过于丰富和时间有限的情况下,只实现了部分功能:
- 支持
Bucket
接口的基本操作,增加、删除、查询存储桶等 - 支持
Bucket
接口的访问控制(acl) - 支持
Bucket
接口的跨域资源共享(cors) - 支持
Bucket
接口的防盗链(referer) - 支持
Object
接口的基本操作,上传、删除、查询存储对象等 - 支持
Object
接口的访问控制(acl)
结构
工程主要包括示例(example)、核心代码(lib)和单元测试(test)三部分
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── example // 示例
├── lib // 核心代码
│ ├── src
│ │ ├── api
│ │ ├── client
│ │ ├── model
│ │ └── src.dart
│ └── tencent_cos_plus.dart
├── pubspec.lock
├── pubspec.yaml
├── tencent_cos_plus.iml
└── test // 单元测试
示例
示例目前仅包括tencent_cos_plus_example.dart
文件,主要是介绍如何使用插件,包括初始化配置、存储桶Api调用和存储对象 Api调用。
├── example
│ └── tencent_cos_plus_example.dart
核心代码
核心代码(lib)部分由client
、api
和model
三层构成:
client
层封装了http请求和接口签名功能api
层实现了存储桶(bucket)和存储对象(object)部分api的调用model
层负责xml数据和实体对象的解析
├── api
│ ├── api.dart
│ ├── cos_abstract_api.dart
│ ├── cos_api_factory.dart
│ ├── cos_api_mixin.dart
│ ├── cos_bucket_api.dart
│ └── cos_object_api.dart
├── client
│ ├── client.dart
│ └── cos_client.dart
├── model
│ ├── common
│ │ ├── cos_access_control_policy.dart
│ │ ├── cos_common.dart
│ │ ├── cos_config.dart
│ │ ├── cos_cors_configuration.dart
│ │ ├── cos_exception.dart
│ │ └── cos_referer_configuration.dart
│ ├── model.dart
│ ├── request
│ │ ├── cos_bucket_acl_header.dart
│ │ ├── cos_create_bucket_configuration.dart
│ │ ├── cos_delete.dart
│ │ ├── cos_get_object.dart
│ │ └── cos_restore_request.dart
│ └── response
│ ├── cos_copy_object_result.dart
│ ├── cos_delete_result.dart
│ ├── cos_list_all_my_buckets_result.dart
│ ├── cos_list_bucket_result.dart
│ └── cos_list_versions_result.dart
单元测试
单元测试包括cos_bucket_api_test.dart
和cos_object_api_test.dart
两个文件,主要是覆盖了存储桶(bucket)
和存储对象(object)部分api的单元测试
└── test├── cos_bucket_api_test.dart└── cos_object_api_test.dart
使用说明
关于如何使用,请参考 README
碰到的问题
在开发过程中,实现需要提交xml数据的接口时,出现签名不匹配的问题。
<?xml version='1.0' encoding='utf-8' ?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The Signature you specified is invalid.</Message><StringToSign>sha1
1666158568;1666218568
488ab174d5f7a6ec0966aeeb82600e185114d7d1
</StringToSign><FormatString>put
/
cors=
content-length=454&content-md5=DfuiC7IOBwIeiVanWPG%2FKg%3D%3D&content-type=application%2Fxml%3B%20charset%3Dutf-8&date=Wed%2C%2019%20Oct%202022%2005%3A49%3A28%20GMT&host=test-app-1251021022.cos.ap-guangzhou.myqcloud.com
</FormatString><Resource>/</Resource><RequestId>NjM0ZjhmZThfNDgzNjQwMGJfMTMwZWFfNDhmODEyZg==</RequestId><TraceId>OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTBjYzE2MjAxN2M1MzJiOTdkZjMxMDVlYTZjN2FiMmI0MjFmNzE4ZjVmM2M0ZTcxNjYwMmQ3N2QzYjA3NzYyNmM=</TraceId>
</Error>
出现这个问题后,先是确认了签名文档提供的签名规则是否一致,然后使用 COS 签名工具
去验证签名结果是否一致,发现在都没有问题。最后通过api接口返回的错误信息,发现参与签名的content-type
和提交给api的content-type
不一致,导致签名不匹配。
通过断点调试,排查到是使用的 http 插件造成的,在设置body
时如果content-type
没有charset
时会赋值默认的charset
,问题找到了。
其它
- 目前不足的是上传文件和下载文件时,没有进度的回调
总结
整个插件实现起来不难,主要需要花时间阅读腾讯对象存储(COS)文档,根据Api文档进行封装和测试,这里开源出来给需要的人提供帮助。
- pub: tencent_cos_plus
- git: flutter_tencent_cos_plus
实现Dart版本对象存储(COS)插件相关推荐
- electron 使用json作为本地存储_使用腾讯云对象存储 COS 作为 Velero 后端存储,实现集群资源备份和还原...
Velero(以前称为 Heptio Ark)是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷,可以在 TKE 集群或自建 Kubenetes 集群中 ...
- 腾讯云对象存储COS + 数据万象CI = 完善的图片解决方案
沈唁 PHP工程师,开源爱好者,WordPress插件Sync QCloud COS 作者,GitHub@sy-records 在日常开发当中,我们必然会遇到一些图片存储问题,例如用户头像.聊天产生的 ...
- 轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)
概述 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据. 个人账户首次开通COS可以免费领取50GB 标准存 ...
- 如何开通并快速入门腾讯云对象存储COS服务?
简介 对象存储(Cloud Object Storage,COS)控制台是 COS 为用户提供的最简单且易于上手的操作方式.用户无需编写代码或运行程序,可直接通过 COS 控制台使用 COS 服务. ...
- 基于hadoop构建对象存储系统_Hadoop社区正式支持腾讯云对象存储COS
8月4日消息,知名大数据开源社区Hadoop近日宣布对腾讯云对象存储COS的正式支持.后续,开发者在基于Hadoop架构进行大数据分析时,能够在不修改代码的情况下,无缝高效地使用腾讯云COS来处理海量 ...
- 腾讯云对象存储cos使用
腾讯云对象存储cos使用 一.新建密钥 1.登录腾讯云进入控制台 2.新建密钥 二.创建对象存储 1.进入对象存储,并创建存储桶 三.创建项目 pom文件 yml文件 创建一util层 control ...
- 认证+1!腾讯云对象存储COS、存储一体机TStor首批通过信通院云原生存储能力评估
数字经济发展日新月异,企业走向数字化,诞生了海量的软件和服务.软件行业高数据规模,高自动化.高迭代速度的要求,给传统软件行业带来了挑战.为推动软件架构更加健全,管理更加高效,云原生的概念应运而生,强调 ...
- WordPress七牛云对象存储免费插件WPQiNiu
有些站长喜欢使用七牛云来加速 WordPress 站点的访问速度,平时需要手工将需要加速的静态文件或图片上传到七牛云存储空间才行.为了提供效率,boke112 联盟建议大家安装这款 WordPre ...
- 腾讯云对象存储 COS 服务之 XML Python SDK 实践
文章目录 前言 1 SDK 安装 2 测试代码准备 - 文件上传和下载 2.1 初始化 2.2 文件上传 2.3 文件下载 3 测试验证 END 前言 腾讯云对象存储(Cloud Object Sto ...
最新文章
- LeetCode简单题之三维形体的表面积
- 在XML中发送二进制数据
- DL之DeepLabv1:DeepLabv1算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- Linux动态链接库的使用
- mr图像翻转的原因_MR图像质量与成像参数的相关性及控制对策
- 视觉SLAM笔记(36) 3D-2D: PnP
- .net 中使用Javacript弹出提示窗口方法总结
- 【转】串口通讯—通信协议
- Django学习入门步骤 教程步骤 python
- this.value和$(this).val()的区别
- 为什么 Flink 无法实时写入 MySQL?
- 计算机正向着巨型化,目前计算机正向着巨型化、()、网络化、智能化方向发展。...
- 《封神演义》中的阐截二教之争 zz
- Mean Rank 和Mean reciprocal rank
- [POI2012] 约会 Rendezvous
- 手工脱壳之 ASPack压缩壳【随机基址】【重定位表加密】
- vim insert VISUAL模式
- cmd下获取指定进程名的pid号,并通过taskkill结束该进程
- QGIS教程-4:添加精美底图的三种方法
- 硝基苯并-2-氧杂-1,3二唑(Nitrobenz-2-oxa-1,3-diazole,NBD)修饰BODIPY荧光探针检测GSH