aliyun_oss_util.dart 2.7 KB
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<String> 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<dynamic> 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<AliyunOssUploadStsEntity?> _getSts(String fileName) async {
    var result =
        await requestClient.get<AliyunOssUploadStsEntity>(Apis.aliyunOssSts, queryParameters: {'fileName': fileName});
    return result;
  }
}

extension StsExtension on AliyunOssUploadStsEntity {
  Auth authGetter() {
    return Auth(
      accessKey: accessKeyId,
      accessSecret: accessKeySecret,
      expire: expiration,
      secureToken: securityToken,
    );
  }
}