upload_file_manager.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. @lazySingleton
  15. class UploadFileManager {
  16. final String _tag = "UploadFileManager";
  17. /// 文件上传Repository
  18. FileUploadRepository fileUploadRepository;
  19. /// 上传信息队列
  20. final List<UploadInfo> _uploadInfoQueue = <UploadInfo>[];
  21. UploadFileManager(this.fileUploadRepository);
  22. /// 上传文件
  23. UploadInfo uploadFile({
  24. required UploadSceneType sceneType,
  25. required File file,
  26. OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
  27. }) {
  28. // 创建一个上传记录,添加到队列中
  29. UploadInfo uploadInfo = UploadInfo(
  30. // 唯一id
  31. id: UuidUtil.generateUuid(),
  32. // 文件名称
  33. fileName: FileUtil.getFileName(file),
  34. // 文件路径
  35. filePath: FileUtil.getFilePath(file),
  36. // 上传场景类型
  37. uploadSceneType: sceneType.name,
  38. // 上传状态
  39. uploadState: UploadState.uploading.name,
  40. );
  41. _uploadInfoQueue.add(uploadInfo);
  42. // 执行上传任务
  43. _doUploadFile(uploadInfo, onUploadInfoUpdateCallback);
  44. return uploadInfo;
  45. }
  46. /// 根据场景类型,批量删除上传记录
  47. void deleteUploadInfoBySceneType(UploadSceneType uploadSceneType) {
  48. _uploadInfoQueue.removeWhere((item) {
  49. return item.uploadSceneType == uploadSceneType.type;
  50. });
  51. }
  52. /// 删除某一个上传记录
  53. void deleteUploadInfo(UploadInfo uploadInfo) {
  54. _uploadInfoQueue.remove(uploadInfo);
  55. }
  56. /// 根据场景类型,获取上传记录列表
  57. List<UploadInfo> findUploadInfoList(UploadSceneType sceneType) {
  58. return _uploadInfoQueue.where((uploadInfo) {
  59. return uploadInfo.uploadSceneType == sceneType.name;
  60. }).toList();
  61. }
  62. /// 通过id,查找上传记录
  63. UploadInfo? findUploadInfo(String id) {
  64. for (var uploadInfo in _uploadInfoQueue) {
  65. if (uploadInfo.id == id) {
  66. return uploadInfo;
  67. }
  68. }
  69. return null;
  70. }
  71. /// 执行,上传文件
  72. void _doUploadFile(
  73. UploadInfo uploadInfo,
  74. OnUploadInfoUpdateCallback? onUploadInfoUpdateCallback,
  75. ) {
  76. File file = File(uploadInfo.filePath ?? "");
  77. fileUploadRepository
  78. .uploadImage(file: file)
  79. .then((UploadResultBean result) {
  80. AtmobLog.d(
  81. _tag,
  82. "上传文件成功 => 访问地址:${result.cdnPrefix}${result.filePath}",
  83. );
  84. // 设置远程访问Url和Cdn前缀
  85. uploadInfo.fileUrl = "${result.cdnPrefix}${result.filePath}";
  86. uploadInfo.fileUrlCdnPrefix = result.cdnPrefix;
  87. // 上传成功,更新状态为成功
  88. uploadInfo.uploadState = UploadState.success.name;
  89. if (onUploadInfoUpdateCallback != null) {
  90. onUploadInfoUpdateCallback(uploadInfo);
  91. }
  92. })
  93. .catchError((error) {
  94. AtmobLog.d(_tag, "上传文件失败,原因: => $error");
  95. // 上传失败,更新状态为失败
  96. uploadInfo.uploadState = UploadState.fail.name;
  97. if (onUploadInfoUpdateCallback != null) {
  98. onUploadInfoUpdateCallback(uploadInfo);
  99. }
  100. });
  101. }
  102. }