file_utils.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import 'dart:io';
  2. import 'dart:convert';
  3. import 'dart:typed_data';
  4. import 'package:clean/utils/image_util.dart';
  5. import 'package:path_provider/path_provider.dart';
  6. import 'package:photo_manager/photo_manager.dart';
  7. import '../model/asset_info.dart';
  8. class FileUtils {
  9. /// 获取 AssetEntity 保存目录
  10. static Future<String> getAssetPath() async {
  11. final directory = await getApplicationDocumentsDirectory();
  12. final path = '${directory.path}/assets';
  13. final dir = Directory(path);
  14. if (!dir.existsSync()) {
  15. dir.createSync(recursive: true);
  16. }
  17. return path;
  18. }
  19. /// 保存 AssetEntity 到本地
  20. static Future<AssetEntity?> saveAsset(AssetEntity asset) async {
  21. try {
  22. final assetPath = await getAssetPath();
  23. final title = asset.id.substring(0, 36);
  24. final assetFile = File('$assetPath/$title.json');
  25. // // 将 AssetEntity 转换为 AssetInfo 后再序列化
  26. // final assetInfo = AssetInfo.fromAssetEntity(asset);
  27. // await assetFile.writeAsString(jsonEncode(assetInfo.toJson()));
  28. // 保存原始图片文件
  29. final file = await asset.file;
  30. if (file != null) {
  31. final imageFile = File('$assetPath/$title.jpg');
  32. await imageFile.writeAsBytes(await file.readAsBytes());
  33. // 保存缩略图
  34. final thumbData = await asset.thumbnailDataWithSize(ThumbnailSize(200, 200));
  35. if (thumbData != null) {
  36. final thumbFile = File('$assetPath/${title}thumb.jpg');
  37. await thumbFile.writeAsBytes(thumbData);
  38. // 创建并保存 AssetInfo
  39. final assetInfo = AssetInfo.fromAssetEntity(asset, '$assetPath/$title.json', '$assetPath/${title}thumb.jpg');
  40. final assetFile = File('$assetPath/$title.json');
  41. await assetFile.writeAsString(jsonEncode(assetInfo.toJson()));
  42. }
  43. }
  44. return asset;
  45. } catch (e) {
  46. print('保存 AssetEntity 失败: $e');
  47. return null;
  48. }
  49. }
  50. /// 从本地读取图片数据
  51. static Future<Uint8List?> getImageData(int assetId) async {
  52. try {
  53. final assetPath = await getAssetPath();
  54. final imageFile = File('$assetPath/$assetId.jpg');
  55. if (await imageFile.exists()) {
  56. return await imageFile.readAsBytes();
  57. }
  58. return null;
  59. } catch (e) {
  60. print('读取图片数据失败: $e');
  61. return null;
  62. }
  63. }
  64. /// 从本地读取缩略图数据
  65. static Future<Uint8List?> getThumbData(String assetId) async {
  66. try {
  67. final assetPath = await getAssetPath();
  68. final thumbFile = File('$assetPath/${assetId}thumb.jpg');
  69. if (await thumbFile.exists()) {
  70. return await thumbFile.readAsBytes();
  71. }
  72. return null;
  73. } catch (e) {
  74. print('读取缩略图数据失败: $e');
  75. return null;
  76. }
  77. }
  78. /// 从本地读取 AssetEntity
  79. static Future<AssetEntity?> getAsset(String fileName) async {
  80. try {
  81. final assetPath = await getAssetPath();
  82. final assetFile = File('$assetPath/$fileName.json');
  83. if (await assetFile.exists()) {
  84. final jsonStr = await assetFile.readAsString();
  85. final json = jsonDecode(jsonStr);
  86. final assetInfo = AssetInfo.fromJson(json);
  87. return await assetInfo.toAssetEntity();
  88. }
  89. return null;
  90. } catch (e) {
  91. print('读取 AssetEntity 失败: $e');
  92. return null;
  93. }
  94. }
  95. /// 获取目录下所有 AssetEntity
  96. static Future<List<AssetInfo>> getAllAssets() async {
  97. try {
  98. final assetPath = await getAssetPath();
  99. final assetDir = Directory(assetPath);
  100. if (!await assetDir.exists()) {
  101. return [];
  102. }
  103. final List<AssetInfo> assets = [];
  104. final List<FileSystemEntity> entities = await assetDir.list().toList();
  105. for (var entity in entities) {
  106. if (entity is File && entity.path.endsWith('.json')) {
  107. final jsonStr = await entity.readAsString();
  108. final json = jsonDecode(jsonStr);
  109. final assetInfo = AssetInfo.fromJson(json);
  110. File? file = await ImageUtil.getImageFile(assetInfo);
  111. if (file != null) {
  112. assetInfo.size = await FileUtils.getFileSize(file);
  113. }
  114. assets.add(assetInfo);
  115. }
  116. }
  117. return assets;
  118. } catch (e) {
  119. print('获取所有 AssetEntity 失败: $e');
  120. return [];
  121. }
  122. }
  123. /// 删除 AssetEntity 文件
  124. static Future<bool> deleteAsset(String fileName) async {
  125. try {
  126. final assetPath = await getAssetPath();
  127. final assetFile = File('$assetPath/$fileName.json');
  128. if (await assetFile.exists()) {
  129. await assetFile.delete();
  130. }
  131. return true;
  132. } catch (e) {
  133. print('删除 AssetEntity 失败: $e');
  134. return false;
  135. }
  136. }
  137. // 获取文件大小
  138. static Future<int> getFileSize(File file) async {
  139. try {
  140. final bytes = await file.length();
  141. return bytes;
  142. } catch (e) {
  143. print('获取文件大小失败: $e');
  144. return 0;
  145. }
  146. }
  147. }