import 'package:dio/dio.dart'; import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart'; import 'package:wow_english/common/request/request_client.dart'; import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart'; import 'package:wow_english/utils/log_util.dart'; /// 阿里云 oss 工具类,服务端给的鉴权一次有效 /// 这个库的Client是个单例,如果并发使用请注意所调用的Client归属,Client.init会生成一个新的_instance class AliyunOssUtil { static Future uploadFile(String filePath) async { // 取出文件名 String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length); Log.d("待上传文件fileName: $fileName"); // 获取鉴权信息 AliyunOssUploadStsEntity stsEntity = await _getSts(fileName); // 鉴权 Client.init( ossEndpoint: stsEntity.endpoint, bucketName: stsEntity.bucket, authGetter: stsEntity.authGetter, ); // 上传文件 final Response resp = await Client().putObjectFile( filePath, fileKey: stsEntity.fileKey, option: PutRequestOption( onSendProgress: (count, total) { Log.d("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { Log.d("receive: count = $count, and total = $total"); }, aclModel: AclMode.private, callback: Callback( callbackUrl: stsEntity.callbackParam.callbackUrl, callbackBody: stsEntity.callbackParam.callbackBody, calbackBodyType: CalbackBodyType.json, ), ), ); return '${stsEntity.host}/${stsEntity.fileKey}'; } /// 获取鉴权信息 static Future _getSts(String fileName) async { var result = await requestClient.get(Apis.aliyunOssSts, queryParameters: {'fileName': fileName}); return result; } } extension StsExtension on AliyunOssUploadStsEntity { Auth authGetter() { return Auth( accessKey: accessKeyId, accessSecret: accessKeySecret, expire: expiration, secureToken: securityToken, ); } }