file_utils.dart 4.6 KB

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