upload_file_manager.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import 'dart:io';
  2. import 'package:injectable/injectable.dart';
  3. import 'package:keyboard/utils/atmob_log.dart';
  4. import 'package:keyboard/utils/upload/upload_scene_type.dart';
  5. import 'package:keyboard/utils/upload/upload_state.dart';
  6. import 'package:keyboard/utils/uuid_util.dart';
  7. import '../../data/api/response/upload_result_bean.dart';
  8. import '../../data/bean/upload_info.dart';
  9. import '../../data/repository/file_upload_repository.dart';
  10. import '../file_util.dart';
  11. /// 上传信息更新回调
  12. typedef OnUploadInfoUpdateCallback = void Function(UploadInfo uploadInfo);
  13. /// 上传失败时回调
  14. typedef OnUploadFailCallback = void Function(dynamic error);
  15. /// 文件上传管理器
  16. @lazySingleton
  17. class UploadFileManager {
  18. final String _tag = "UploadFileManager";
  19. /// 文件上传Repository
  20. FileUploadRepository fileUploadRepository;
  21. /// 上传信息队列
  22. final List<UploadInfo> _uploadInfoQueue = <UploadInfo>[];
  23. UploadFileManager(this.fileUploadRepository);
  24. /// 上传文件
  25. UploadInfo uploadFile({
  26. required UploadSceneType sceneType,
  27. required File file,
  28. OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
  29. OnUploadFailCallback? onUploadFailCallback,
  30. }) {
  31. // 创建一个上传记录,添加到队列中
  32. UploadInfo uploadInfo = UploadInfo(
  33. // 唯一id
  34. id: UuidUtil.generateUuid(),
  35. // 文件名称
  36. fileName: FileUtil.getFileName(file),
  37. // 文件路径
  38. filePath: FileUtil.getFilePath(file),
  39. // 上传场景类型
  40. uploadSceneType: sceneType.name,
  41. // 上传状态
  42. uploadState: UploadState.uploading.name,
  43. );
  44. _uploadInfoQueue.add(uploadInfo);
  45. // 执行上传任务
  46. _doUploadFile(
  47. uploadInfo,
  48. onUploadInfoUpdateCallback: onUploadInfoUpdateCallback,
  49. onUploadFailCallback: onUploadFailCallback,
  50. );
  51. return uploadInfo;
  52. }
  53. /// 根据场景类型,批量删除上传记录
  54. void deleteUploadInfoBySceneType(UploadSceneType uploadSceneType) {
  55. _uploadInfoQueue.removeWhere((item) {
  56. return item.uploadSceneType == uploadSceneType.type;
  57. });
  58. }
  59. /// 删除某一个上传记录
  60. void deleteUploadInfo(UploadInfo uploadInfo) {
  61. _uploadInfoQueue.remove(uploadInfo);
  62. }
  63. /// 根据场景类型,获取上传记录列表
  64. List<UploadInfo> findUploadInfoList(UploadSceneType sceneType) {
  65. return _uploadInfoQueue.where((uploadInfo) {
  66. return uploadInfo.uploadSceneType == sceneType.name;
  67. }).toList();
  68. }
  69. /// 通过id,查找上传记录
  70. UploadInfo? findUploadInfo(String id) {
  71. for (var uploadInfo in _uploadInfoQueue) {
  72. if (uploadInfo.id == id) {
  73. return uploadInfo;
  74. }
  75. }
  76. return null;
  77. }
  78. /// 执行,上传文件
  79. void _doUploadFile(
  80. UploadInfo uploadInfo, {
  81. OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
  82. OnUploadFailCallback? onUploadFailCallback,
  83. }) {
  84. File file = File(uploadInfo.filePath ?? "");
  85. fileUploadRepository
  86. .uploadImage(file: file)
  87. .then((UploadResultBean result) {
  88. AtmobLog.d(
  89. _tag,
  90. "上传文件成功 => 访问地址:${result.cdnPrefix}${result.filePath}",
  91. );
  92. // 设置Cdn前缀和后端文件地址
  93. uploadInfo.fileUrlCdnPrefix = result.cdnPrefix;
  94. uploadInfo.fileBackendPath = result.filePath;
  95. // 拼接远程访问Url
  96. uploadInfo.fileUrl = "${result.cdnPrefix}${result.filePath}";
  97. // 上传成功,更新状态为成功
  98. uploadInfo.uploadState = UploadState.success.name;
  99. if (onUploadInfoUpdateCallback != null) {
  100. onUploadInfoUpdateCallback(uploadInfo);
  101. }
  102. })
  103. .catchError((error) {
  104. AtmobLog.d(_tag, "上传文件失败,原因: => $error");
  105. // 上传失败,更新状态为失败
  106. uploadInfo.uploadState = UploadState.fail.name;
  107. if (onUploadInfoUpdateCallback != null) {
  108. onUploadInfoUpdateCallback(uploadInfo);
  109. }
  110. if (onUploadFailCallback != null) {
  111. onUploadFailCallback(error);
  112. }
  113. });
  114. }
  115. }