getMessagesFromMergedMessage static method

Future<NIMResult<List<NIMMessage>>> getMessagesFromMergedMessage(
  1. MergedMessage mergedMsg
)

获取合并转发消息中的消息列表

Implementation

static Future<NIMResult<List<NIMMessage>>> getMessagesFromMergedMessage(
    MergedMessage mergedMsg) async {
  if (kIsWeb) {
    // ---- Web 平台:直接用 http 下载到内存,无法使用文件系统 ----
    if (mergedMsg.url == null || mergedMsg.url!.isEmpty) {
      return NIMResult.failure(message: 'url is empty');
    }
    try {
      final response = await http.get(Uri.parse(mergedMsg.url!));
      if (response.statusCode != 200) {
        return NIMResult.failure(
            message: 'http download failed: ${response.statusCode}');
      }
      final Uint8List bytes = response.bodyBytes;
      // 校验 md5
      if (mergedMsg.md5 != null && mergedMsg.md5!.isNotEmpty) {
        final digest = crypto.md5.convert(bytes);
        final fileMd5 = digest.toString();
        if (fileMd5 != mergedMsg.md5) {
          return NIMResult.failure(message: 'file md5 not match');
        }
      }
      // 解析文件内容
      final fileContent = utf8.decode(bytes);
      final lines = fileContent.split('\n');
      List<NIMMessage> messages = List.empty(growable: true);
      if (lines.length > 1) {
        for (int i = 1; i < lines.length; i++) {
          // 反序列化
          final msg = await NimCore.instance.messageService
              .messageDeserialization(lines[i]);
          if (msg.isSuccess && msg.data != null) {
            messages.add(msg.data!);
          }
        }
        return NIMResult.success(data: messages);
      } else {
        return NIMResult.failure(message: 'file is empty');
      }
    } catch (e) {
      return NIMResult.failure(message: 'http download error: $e');
    }
  } else {
    // ---- 非 Web 平台:使用原有文件系统下载逻辑 ----
    // 使用 dynamic 避免 dart:io.Directory 与 stub.Directory 的类型冲突
    dynamic directory;
    if (Platform.isAndroid) {
      directory = await getExternalStorageDirectory();
    } else {
      directory = await getApplicationDocumentsDirectory();
    }
    if (directory == null) {
      return NIMResult.failure(message: 'directory is null');
    }
    final fileName = '$mergeFileName${mergedMsg.messageId}';
    final filePath = '${directory.path}/$fileName';
    // 先下载文件
    final downloadRes = await NimCore.instance.storageService
        .downloadFile(mergedMsg.url, filePath);
    if (downloadRes.isSuccess) {
      // 读取文件
      final file = File(filePath);
      if (file.existsSync()) {
        // 校验 md5(直接用 crypto 计算,避免依赖 dart:io File 扩展)
        var fileMd5 = crypto.md5.convert(await file.readAsBytes()).toString();
        if (fileMd5 != mergedMsg.md5) {
          return NIMResult.failure(message: 'file md5 not match');
        }
        // 读取文件内容
        final List<int> fileStream = file.readAsBytesSync();
        final fileContent = utf8.decode(fileStream);
        final lines = fileContent.split('\n');
        List<NIMMessage> messages = List.empty(growable: true);
        if (lines.length > 1) {
          for (int i = 1; i < lines.length; i++) {
            // 反序列化
            final msg = await NimCore.instance.messageService
                .messageDeserialization(lines[i]);
            if (msg.isSuccess && msg.data != null) {
              messages.add(msg.data!);
            }
          }
          return NIMResult.success(data: messages);
        } else {
          return NIMResult.failure(message: 'file is empty');
        }
      } else {
        return NIMResult.failure(message: 'file not exist');
      }
    } else {
      return NIMResult.failure(message: downloadRes.errorDetails);
    }
  }
}