import 'package:dio/dio.dart'; import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart'; import 'package:wow_english/common/request/api_response/api_response_entity.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); String fileName = filePath.split('/').last; Log.d("待上传文件: [$filePath], 截取的fileName: [$fileName]"); // 获取鉴权信息 AliyunOssUploadStsEntity? stsEntity = await _getSts(fileName); if (stsEntity == null) { // 为空的情况抛出错误 throw 'STS为空'; } //Log.d('鉴权信息: $stsEntity'); // 鉴权 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/$total"); }, onReceiveProgress: (count, total) { Log.d("receive: $count/$total"); }, aclModel: AclMode.inherited, callback: Callback( callbackUrl: stsEntity.callbackParam.callbackUrl, callbackBody: stsEntity.callbackParam.callbackBody, calbackBodyType: CalbackBodyType.json, ), ), ); var url = '${stsEntity.host}/${stsEntity.fileKey}'; // 正确返回时,是我们自己服务器的回调,所以使用我们的格式解析 var result = ApiResponse.fromJson(resp.data); Log.d('上传结果: $result, url: $url'); if (result.code != 200) { // 上传失败抛出错误 throw result.msg ?? '未知错误'; } return url; } /// 获取鉴权信息 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, ); } }