flutter---->阿里云oss的插件
目前为止,阿里云官方并没有dart版本的oss sdk,所以才开发了这个插件flutter_oss_aliyun提供对oss sdk的支持。
flutter_oss_aliyun
一个访问阿里云oss并且支持STS临时访问凭证访问OSS的flutter库,基本上涵盖阿里云oss sdk的所有功能。
flutter pub: https://pub.dev/packages/flutter_oss_aliyun
github : https://github.com/huhx/flutter_oss_aliyun
oss sts document: https://help.aliyun.com/document_detail/100624.html
初始化Client
添加依赖
dependencies:
flutter_oss_aliyun: ^6.2.2
初始化oss client, 这里我们提供两种方式
1. 提供sts server地址,需要后端添加这个api
Client.init(
stsUrl: "server url get sts token",
ossEndpoint: "oss-cn-beijing.aliyuncs.com",
bucketName: "bucket name",
);
后端api至少需要返回以下数据:
{
"AccessKeyId": "AccessKeyId",
"AccessKeySecret": "AccessKeySecret",
"SecurityToken": "SecurityToken",
"Expiration": "2022-03-22T11:33:06Z"
}
2. 自定义authGetter得到Auth
Client.init(
ossEndpoint: "oss-cn-beijing.aliyuncs.com",
bucketName: "bucketName",
authGetter: _authGetter
);
Auth _authGetter() {
return Auth(
accessKey: "accessKey",
accessSecret: 'accessSecret',
expire: '2023-02-23T14:02:46Z',
secureToken: 'token',
);
}
你可以传入自定义的Dio
在init函数中,你可以传入dio,做到dio的定制化。比如日志或者其他的interceptors.
Client.init(
stsUrl: "server url get sts token",
ossEndpoint: "oss-cn-beijing.aliyuncs.com",
bucketName: "bucket name",
dio: Dio(BaseOptions(connectTimeout: 9000)),
);
使用
- 文件上传
- 追加文件上传
- 跨bucket文件复制
- 取消文件上传
- 批量文件上传
- 本地文件上传
- 批量本地文件上传
- 文件下载
- 文件下载并保存
- 文件删除
- 批量文件删除
- 获取已签名的文件url
- 获取多个已签名的文件url
- 列举所有的存储空间
- 列举存储空间中所有文件
- 获取bucket信息
- 获取bucket的储容量以及文件数量
- 获取文件元信息
- regions的查询
- bucket acl的操作
- bucket policy的操作
文件上传
关于callback的使用: https://help.aliyun.com/document_detail/31989.htm?spm=a2c4g.11186623.0.0.73a830ffn45LMY#reference-zkm-311-hgb
final bytes = "file bytes".codeUnits;
await Client().putObject(
bytes,
"test.txt",
option: PutRequestOption(
onSendProgress: (count, total) {
print("send: count = $count, and total = $total");
},
onReceiveProgress: (count, total) {
print("receive: count = $count, and total = $total");
},
override: false,
aclModel: AclMode.publicRead,
storageType: StorageType.ia,
headers: {"cache-control": "no-cache"},
callback: Callback(
callbackUrl: "callback url",
callbackBody: "{\"mimeType\":\${mimeType}, \"filepath\":\${object},\"size\":\${size},\"bucket\":\${bucket},\"phone\":\${x:phone}}",
callbackVar: {"x:phone": "android"},
calbackBodyType: CalbackBodyType.json,
),
),
);
PutRequestOption 字段说明,字段皆为非必需
| Filed | Default value | Description |
|---|---|---|
| override | true | true: 允许覆盖同名Object false: 禁止覆盖同名Object |
| aclModel | inherited | 1. publicWrite: 任何人(包括匿名访问者)都可以对该Object进行读写操作 2. publicRead: 只有该Object的拥有者可以对该Object进行写操作,任何人(包括匿名访问者)都可以对该Object进行读操作 3. private: 只有Object的拥有者可以对该Object进行读写操作,其他人无法访问该Object 4. inherited: 该Object遵循Bucket的读写权限,即Bucket是什么权限,Object就是什么权限 参考文档: https://help.aliyun.com/document_detail/100676.htm?spm=a2c4g.11186623.0.0.56637952SnxOWV#concept-blw-yqm-2gb |
| storageType | Standard | 参考文档: https://help.aliyun.com/document_detail/51374.htm?spm=a2c4g.11186623.0.0.56632b55htpEQX#concept-fcn-3xt-tdb |
追加文件上传
final Response<dynamic> resp = await Client().appendObject(
Uint8List.fromList(utf8.encode("Hello World")),
"test_append.txt",
);
final Response<dynamic> resp2 = await Client().appendObject(
position: int.parse(resp.headers["x-oss-next-append-position"]?[0]),
Uint8List.fromList(utf8.encode(", Fluter.")),
"test_append.txt",
);
跨bucket复制文件
final Response<dynamic> resp = await Client().copyObject(
const CopyRequestOption(
sourceFileKey: 'test.csv',
targetFileKey: "test_copy.csv",
targetBucketName: "bucket_2"
),
);
取消文件上传
final CancelToken cancelToken = CancelToken();
final bytes = ("long long bytes" * 1000).codeUnits;
Client().putObject(
Uint8List.fromList(utf8.encode(string)),
"cancel_token_test.txt",
cancelToken: cancelToken,
option: PutRequestOption(
onSendProgress: (count, total) {
if (kDebugMode) {
print("send: count = $count, and total = $total");
}
if (count > 56) {
cancelToken.cancel("cancel the uploading.");
}
},
),
).then((response) {
// success
print("upload success = ${response.statusCode}");
}).catchError((err) {
if (CancelToken.isCancel(err)) {
print("error message = ${err.message}");
} else {
// handle other errors
}
});
批量文件上传
await Client().putObjects([
AssetEntity(
filename: "filename1.txt",
bytes: "files1".codeUnits,
option: PutRequestOption(
onSendProgress: (count, total) {
print("send: count = $count, and total = $total");
},
onReceiveProgress: (count, total) {
print("receive: count = $count, and total = $total");
},
aclModel: AclMode.private,
),
),
AssetEntity(filename: "filename2.txt", bytes: "files2".codeUnits),
]);
本地文件上传
final Response<dynamic> resp = await Client().putObjectFile(
"/Users/aaa.pdf",
fileKey: "aaa.png",
option: PutRequestOption(
onSendProgress: (count, total) {
print("send: count = $count, and total = $total");
},
onReceiveProgress: (count, total) {
print("receive: count = $count, and total = $total");
},
aclModel: AclMode.private,
),
);
批量本地文件上传
final List<Response<dynamic>> resp = await Client().putObjectFiles(
[
AssetFileEntity(
filepath: "//Users/private.txt",
option: PutRequestOption(
onSendProgress: (count, total) {
print("send: count = $count, and total = $total");
},
onReceiveProgress: (count, total) {
print("receive: count = $count, and total = $total");
},
override: false,
aclModel: AclMode.private,
),
),
AssetFileEntity(
filepath: "//Users/splash.png",
filename: "aaa.png",
option: PutRequestOption(
onSendProgress: (count, total) {
print("send: count = $count, and total = $total");
},
onReceiveProgress: (count, total) {
print("receive: count = $count, and total = $total");
},
override: true,
),
),
],
);
文件下载
await Client().getObject(
"test.txt",
onReceiveProgress: (count, total) {
debugPrint("received = $count, total = $total");
},
);
文件下载并保存
await Client().downloadObject(
"test.txt",
"./example/test.txt",
onReceiveProgress: (count, total) {
debugPrint("received = $count, total = $total");
},
);
文件删除
await Client().deleteObject("test.txt");
批量文件删除
await Client().deleteObjects(["filename1.txt", "filename2.txt"]);
获取已签名的文件url
需要注意的是: 这个操作并不安全,因为url包含security-token信息,即使过期时间比较短. 这个url可以直接在浏览器访问
final String url = await Client().getSignedUrl("filename1.txt");
获取多个已签名的文件url
需要注意的是: 这个操作并不安全,因为url包含security-token信息,即使过期时间比较短
final Map<String, String> result = await Client().getSignedUrls(["test.txt", "filename1.txt"]);
列举所有的存储空间
列举请求者拥有的所有存储空间(Bucket)。您还可以通过设置prefix、marker或者max-keys参数列举满足指定条件的存储空间。参考: https://help.aliyun.com/document_detail/31957.html
final Response<dynamic> resp = await Client().listBuckets({"max-keys": 2});
列举存储空间中所有文件
接口用于列举存储空间(Bucket)中所有文件(Object)的信息。请求参数和返回结果,请参考: https://help.aliyun.com/document_detail/187544.html
final Response<dynamic> resp = await Client().listFiles({});
获取bucket信息
查看存储空间(Bucket)的相关信息。返回结果请参考: https://help.aliyun.com/document_detail/31968.html
final Response<dynamic> resp = await Client().getBucketInfo();
获取bucket的储容量以及文件数量
获取指定存储空间(Bucket)的存储容量以及文件(Object)数量。返回结果请参考: https://help.aliyun.com/document_detail/426056.html
final Response<dynamic> resp = await Client().getBucketStat();
获取文件元信息
final Response<dynamic> resp = await Client().getObjectMeta("huhx.csv");
regions的查询
- 查询所有
final Response<dynamic> resp = await Client().getAllRegions();
- 查询特定
final Response<dynamic> resp = await Client().getRegion("oss-ap-northeast-1");
bucket acl的操作
- 查询
final Response<dynamic> resp = await Client().getBucketAcl(
bucketName: "bucket-name",
);
- 更新
final Response<dynamic> resp = await Client().putBucketAcl(
AciMode.publicRead,
bucketName: "bucket-name",
);
bucket policy的操作
- 查询
final Response<dynamic> resp = await Client().getBucketPolicy(
bucketName: "bucket-name",
);
- 更新
final Response<dynamic> resp = await Client().putBucketPolicy(
{},
bucketName: "bucket-name",
);
- 删除
final Response<dynamic> resp = await Client().deleteBucketPolicy(
bucketName: "bucket-name",
);
flutter---->阿里云oss的插件的更多相关文章
- 阿里云oss视频上传不能在线播放,js,javascript,在线播放器,插件
网页视频播放插件 发现阿里云oss储存,上传了视频不能在线播放. 解决方法:使用插件播放即可解决. <html> <head> <meta charset="u ...
- phpcmsv9 阿里云OSS云存储整合教程
该教程算不上是phpcmsv9阿里云oss插件,所以整个修改及其代码覆盖前请一定记得备份.还有一点就是后台发布文章时上传的附件还是会保存在你的服务器上,基于以下原因:1.个人的需求是前台页面需要使用t ...
- angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)
2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...
- (转)云存储:阿里云OSS 、又拍云和 七牛 的比较
阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费 ...
- 发布阿里云OSS for phpcmsV9整合教程
说明:这个算不上是插件,因为没有安装包,需要手工修改代码. 还有一点就是后台发布文章时上传的附件还是会保存在你的服务器上,基于以下原因: 1.个人的需求是前台页面需要使用thumb函数生成多个缩略图大 ...
- ECStore图片存储采用阿里云OSS(图片存储)服务
主要功能:ECStore图片存储采用阿里云OSS(图片存储)服务 适用版本:ECStore 授权方式:授权域名使用,付费插件 联系方式: QQ 275553385 mail: jimingson ...
- 阿里云oss挂载到linux本地文件系统
对象存储 OSS 阿里云对象存储服务 (OSS) 是一种高度可伸缩且安全可靠的云对象存储服务,让您可以存储.备份和归档大量数据.阿里云 OSS 是一种简单易用的服务,让您每秒能处理数百万请求,它还支持 ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- php阿里云oss文件上传
php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...
- 详解wordpress如何把文件保存到阿里云OSS上!
自己搞了一个Wordpress的博客,装完之后一直晾着没管,最近闲来开荒.为了减小服务器的带宽.存储.CUP的压力,决定把博客中的所有文件都保存到阿里云OSS上面. 关于这个问题,自己去调用OSS的S ...
随机推荐
- 浏览器输入URL发生了什么:DNS解析、TCP握手、HTTP缓存、重定向、服务器状态码、渲染引擎和JS引擎互斥、渲染过程、浏览器进程、网络进程、渲染进程
输入地址,浏览器查找域名的 IP 地址. 浏览器向 该 IP 地址的web 服务器发送一个 HTTP 请求, 在发送请求之前浏览器和服务器建立TCP的三次握手,判断是否是HTTP缓存, 如果是强制缓存 ...
- 修改yarn 缓存包 默认安装位置
yarn和npm一样,默认安装的全局包和缓存都在C盘里:npm的在:C:\Users\Administrator\AppData\Roaming\npmyarn的在:C:\Users\Admin\Ap ...
- mapboxGL2离线化应用
https://blog.csdn.net/GISShiXiSheng/article/details/120300679?spm=1001.2014.3001.5501
- UVA10404
由题意可知,这题和巴什博弈没什么关系了 相似题目:AtCoder Beginner Contest 278 F - Shiritori 预备知识:DP,博弈论的必胜态和必败态 问题的关键是确定\(f_ ...
- Element UI 父组件el-tabel选择某行跳转子组件,在子组件的el-table中选择数组,添加到父组件操作行中
解决思路: 1.在父组件选择操作某行数据时,将父组件的行号暂存(index). 2.跳转子组件页面,选择某行数据,点击提交将该行数据传递个父组件 3.父组件取到第一步暂存行号(index),将子组件传 ...
- 认识flutter
flutter是谷歌的移动的ui框架,可以快速的在ios和安卓上构建高质量的原生用户界面.最主要的是完全免费开源.开发快,最重要的是使用flutter开发的开发工作者也越来越多了,生态圈也越来越好了. ...
- flink常用命令
1.查看flink任务 /var/lib/hadoop-hdfs/flink/bin/flink list 2.停止flink任务 /var/lib/hadoop-hdfs/flink/bin/fl ...
- jmeter 数据库连接
位置:右击添加>配置元件>JDBC Connection Configuration 作用:需要对数据库发起请求查询数据或者对数据库施加压力 3.设置说明 Variable Name(变量 ...
- 艾思最新案例分享:塔蓝物流app-物流仓储管理系统app. app开发
塔蓝物流app是一款物流仓储管理app:主要业务范围空运,海运,进出口货物及过境货物的运输代理,包括揽物订舱,仓储(危险品除外),包装,搬运装卸,中转,流通加工,集装箱拼装拆箱(危险品除外),结算运杂 ...
- docker&docker-compose安装
一.docker安装 1.通过 uname -r 命令查看当前的内核版本,Docker 要求 CentOS 系统的内核版本高于 3.10 uname -r 2.查看系统是否安装过docker yum ...