| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import 'dart:io';
- import 'package:injectable/injectable.dart';
- import 'package:keyboard/utils/atmob_log.dart';
- import 'package:keyboard/utils/upload/upload_scene_type.dart';
- import 'package:keyboard/utils/upload/upload_state.dart';
- import 'package:keyboard/utils/uuid_util.dart';
- import '../../data/api/response/upload_result_bean.dart';
- import '../../data/bean/upload_info.dart';
- import '../../data/repository/file_upload_repository.dart';
- import '../file_util.dart';
- /// 上传信息更新回调
- typedef OnUploadInfoUpdateCallback = void Function(UploadInfo uploadInfo);
- /// 上传失败时回调
- typedef OnUploadFailCallback = void Function(dynamic error);
- /// 文件上传管理器
- @lazySingleton
- class UploadFileManager {
- final String _tag = "UploadFileManager";
- /// 文件上传Repository
- FileUploadRepository fileUploadRepository;
- /// 上传信息队列
- final List<UploadInfo> _uploadInfoQueue = <UploadInfo>[];
- UploadFileManager(this.fileUploadRepository);
- /// 上传文件
- UploadInfo uploadFile({
- required UploadSceneType sceneType,
- required File file,
- OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
- OnUploadFailCallback? onUploadFailCallback,
- }) {
- // 创建一个上传记录,添加到队列中
- UploadInfo uploadInfo = UploadInfo(
- // 唯一id
- id: UuidUtil.generateUuid(),
- // 文件名称
- fileName: FileUtil.getFileName(file),
- // 文件路径
- filePath: FileUtil.getFilePath(file),
- // 上传场景类型
- uploadSceneType: sceneType.name,
- // 上传状态
- uploadState: UploadState.uploading.name,
- );
- _uploadInfoQueue.add(uploadInfo);
- // 执行上传任务
- _doUploadFile(
- uploadInfo,
- onUploadInfoUpdateCallback: onUploadInfoUpdateCallback,
- onUploadFailCallback: onUploadFailCallback,
- );
- return uploadInfo;
- }
- /// 根据场景类型,批量删除上传记录
- void deleteUploadInfoBySceneType(UploadSceneType uploadSceneType) {
- _uploadInfoQueue.removeWhere((item) {
- return item.uploadSceneType == uploadSceneType.type;
- });
- }
- /// 删除某一个上传记录
- void deleteUploadInfo(UploadInfo uploadInfo) {
- _uploadInfoQueue.remove(uploadInfo);
- }
- /// 根据场景类型,获取上传记录列表
- List<UploadInfo> findUploadInfoList(UploadSceneType sceneType) {
- return _uploadInfoQueue.where((uploadInfo) {
- return uploadInfo.uploadSceneType == sceneType.name;
- }).toList();
- }
- /// 通过id,查找上传记录
- UploadInfo? findUploadInfo(String id) {
- for (var uploadInfo in _uploadInfoQueue) {
- if (uploadInfo.id == id) {
- return uploadInfo;
- }
- }
- return null;
- }
- /// 执行,上传文件
- void _doUploadFile(
- UploadInfo uploadInfo, {
- OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
- OnUploadFailCallback? onUploadFailCallback,
- }) {
- File file = File(uploadInfo.filePath ?? "");
- fileUploadRepository
- .uploadImage(file: file)
- .then((UploadResultBean result) {
- AtmobLog.d(
- _tag,
- "上传文件成功 => 访问地址:${result.cdnPrefix}${result.filePath}",
- );
- // 设置Cdn前缀和后端文件地址
- uploadInfo.fileUrlCdnPrefix = result.cdnPrefix;
- uploadInfo.fileBackendPath = result.filePath;
- // 拼接远程访问Url
- uploadInfo.fileUrl = "${result.cdnPrefix}${result.filePath}";
- // 上传成功,更新状态为成功
- uploadInfo.uploadState = UploadState.success.name;
- if (onUploadInfoUpdateCallback != null) {
- onUploadInfoUpdateCallback(uploadInfo);
- }
- })
- .catchError((error) {
- AtmobLog.d(_tag, "上传文件失败,原因: => $error");
- // 上传失败,更新状态为失败
- uploadInfo.uploadState = UploadState.fail.name;
- if (onUploadInfoUpdateCallback != null) {
- onUploadInfoUpdateCallback(uploadInfo);
- }
- if (onUploadFailCallback != null) {
- onUploadFailCallback(error);
- }
- });
- }
- }
|