本文主要讲述在 Flutter 项目中如何实现将文件上传到华为 OBS(对象存储)中,并封装为三方库方便灵活使用。

背景介绍

在大多项目中都会存在文件上传的需求,之前的实现都是调用后台的文件上传接口将文件上传到服务器上,但是这样会存在一个问题,因为文件上传会占用带宽导致在文件上传中调用其他接口的时候就会存在访问慢的情况,解决方案当然是升级带宽或者单独使用一台服务器作为文件服务,而且要带宽足够大不然上传下载的时候会很慢,但是这样两种方案成本都比较高。随着云计算的到来,各大云服务商都提供了对象存储的服务,费用便宜、带宽高、不影响业务系统而且提供了很多附加功能,比如图片处理、图片鉴黄等功能。

因目前在做的项目甲方爸爸明确要求云服务要使用华为云,所以对象存储服务也必须使用华为云的 OBS 服务,而为了节约人力成本移动端使用的是 Flutter 跨平台开发,所以就有了本篇文章标题的需求,需要在 Flutter 中实现将文件上传到华为云 OBS 中,而华为云 OBS 并没有提供 Flutter SDK,所以就需要自己实现,首先看一下实现以后的代码使用效果。

使用

目前只封装了两个简单的功能:上传对象、上传文件。

首先在项目的 pubspec.yaml 里添加依赖,如下:

  flutter_hw_obs:   git:    url: https://github.com/loongwind/flutter_hw_obs.git    ref: 0.0.3

然后在使用的地方引入obs_client包:

import 'package:flutter_hw_obs/obs_client.dart';

初始化

调用 OBSClient.init 进行初始化。

OBSClient.init("${AccessKey}", "${SecretAccessKey}", "${AccessDomain}", "${BucketName}");

参数说明:

  • AccessKey: 用于标识华为用户,在华为云控制台创建子账号获取

  • SecretAccessKey: 用于验证用户的密钥,在华为云控制台创建子账号获取

  • AccessDomain: 访问域名,创建 OBS 桶后会自动分配访问域名,如xxx.obs.cn-southwest-2.myhuaweicloud.com

  • BucketName: 桶名称,创建 OBS 桶时的名称

在使用其他 api 之前必须先进行初始化。

上传对象

使用 OBSClient.putObject 上传对象。

OBSResponse response = await OBSClient.putObject("${ObjectName}", data, xObsAcl="$xObsAcl");​OBSResponse response = await OBSClient.putObject("test/hello.txt", utf8.encode("Hello OBS"));

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

参数说明:

  • ObjectName:对象名称,即存储到 OBS 上的文件名称,带路径,如:test/hello.txt

  • data: 上传对象数据,类型是 List 的二进制数据

  • xObsAcl: 上传对象的权限控制控制策略,可选值如下表所示,默认为public-read 即公共读

预定义的权限控制策略描述
private桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限
public-read设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本。设在对象上,所有人可以获取该对象内容和元数据。
public-read-write设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务。设在对象上,所有人可以获取该对象内容和元数据。
public-read-delivered设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本,可以获取该桶内对象的内容和元数据。不能应用在对象上。
public-read-write-delivered设在桶上,所有人可以获取该桶内对象列表、桶内多段任务、桶的元数据、桶的多版本、上传对象删除对象、初始化段任务、上传段、合并段、拷贝段、取消多段上传任务,可以获取该桶内对象的内容和元数据。不能应用在对象上。
bucket-owner-full-control设在对象上,桶或对象的所有者拥有完全控制的权限,其他任何人都没有访问权限。

返回结果是一个 OBSResponse 对象,代码如下:

class OBSResponse{  String" />flutter_hw_obs

作者:loongwind