uploadMergedMessageFile static method

Future<NIMResult<MessageUploadInfo>> uploadMergedMessageFile(
  1. List<NIMMessage> messages
)

合并并上传消息,返回上传后的url和md5

Implementation

static Future<NIMResult<MessageUploadInfo>> uploadMergedMessageFile(
    List<NIMMessage> messages) async {
  final mergeMsg = await createForwardMessageListFileDetail(messages);
  if (mergeMsg.isSuccess && mergeMsg.data != null) {
    final List<int> fileBytes = utf8.encode(mergeMsg.data!);
    String fileName =
        "$mergeFileName${DateTime.now().millisecondsSinceEpoch}";
    var directory;
    if (kIsWeb) {
      // Web 平台:通过 html.File 对象上传,filePath 传空
      final htmlFileObj = html.File([
        html.Blob([Uint8List.fromList(fileBytes)])
      ], fileName);
      final uploadTask = await NimCore.instance.storageService
          .createUploadFileTask(NIMUploadFileParams(filePath: ''),
              fileObj: htmlFileObj);
      if (uploadTask.data == null) {
        return NIMResult.failure(message: 'create task failed');
      }
      final uploadRes = await NimCore.instance.storageService
          .uploadFile(uploadTask.data!, fileObj: htmlFileObj);
      if (uploadRes.isSuccess && uploadRes.data != null) {
        final md5 = crypto.md5.convert(fileBytes).toString();
        return NIMResult.success(
            data: MessageUploadInfo(uploadRes.data!, md5));
      } else {
        return NIMResult.failure(message: uploadRes.errorDetails);
      }
    }

    if (Platform.isAndroid) {
      directory = await getExternalStorageDirectory();
    } else {
      directory = await getApplicationDocumentsDirectory();
    }
    if (directory == null) {
      return NIMResult.failure(message: 'directory is null');
    }
    File file;
    try {
      file = File('${directory.path}/$fileName');
      file.writeAsBytesSync(fileBytes);
    } catch (e) {
      return NIMResult.failure(message: 'create file error ${e.toString()}');
    }
    final uploadTask = await NimCore.instance.storageService
        .createUploadFileTask(NIMUploadFileParams(filePath: file.path));
    if (uploadTask.data == null) {
      return NIMResult.failure(message: 'create task failed');
    }
    final uploadRes =
        await NimCore.instance.storageService.uploadFile(uploadTask.data!);
    if (uploadRes.isSuccess && uploadRes.data != null) {
      try {
        // 直接用 crypto 计算,避免依赖 dart:io File 扩展
        final md5 = crypto.md5.convert(await file.readAsBytes()).toString();
        file.delete();
        return NIMResult.success(
            data: MessageUploadInfo(uploadRes.data!, md5));
      } catch (exception) {
        return NIMResult.failure(
            message: 'get md5 error ${exception.toString()}');
      }
    } else {
      return NIMResult.failure(message: uploadRes.errorDetails);
    }
  } else {
    return NIMResult.failure(message: mergeMsg.errorDetails);
  }
}