getMessagesFromMergedMessage static method
获取合并转发消息中的消息列表
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);
}
}
}