diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index c579bd8e8..96388f369 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -340,7 +340,9 @@ class MeetingHomeController extends GetxController { fileName = path.basename(filePath); } else { FilePickerResult? result = await FilePicker.platform.pickFiles( - withData: true, + withData: false, + type: FileType.audio, + allowMultiple: false, ); if (result != null) { PlatformFile file = result.files.first; @@ -357,7 +359,8 @@ class MeetingHomeController extends GetxController { return; } - filePath = await _saveFile(file); + // 使用文件路径而不是字节数据 + filePath = file.path ?? await _copyFileToLocal(file); fileName = file.name; } else { EasyLoading.dismiss(); @@ -419,6 +422,48 @@ class MeetingHomeController extends GetxController { return meetingId; } + // 新增:流式复制文件方法 + Future _copyFileToLocal(PlatformFile file) async { + final directory = await getApplicationDocumentsDirectory(); + final directoryDir = Directory('${directory.path}/ExternalAudio'); + if (!await directoryDir.exists()) { + await directoryDir.create(recursive: true); + } + + final String targetPath = '${directory.path}/ExternalAudio/${file.name}'; + + if (file.path != null) { + // 如果有原始路径,直接复制文件 + final sourceFile = File(file.path!); + await sourceFile.copy(targetPath); + } else { + // 如果没有路径,使用流式写入(分块处理) + final targetFile = File(targetPath); + final sink = targetFile.openWrite(); + + try { + // 分块写入,避免一次性加载大文件到内存 + const chunkSize = 1024 * 1024; // 1MB chunks + final bytes = file.bytes!; + + for (int i = 0; i < bytes.length; i += chunkSize) { + final end = + (i + chunkSize < bytes.length) ? i + chunkSize : bytes.length; + sink.add(bytes.sublist(i, end)); + + // 给UI线程一些时间处理其他任务 + await Future.delayed(Duration(milliseconds: 1)); + } + } finally { + await sink.close(); + } + } + + return targetPath; + } + +// 移除原来的_saveFile方法,替换为上面的_copyFileToLocal + Future _saveFile(PlatformFile file) async { final directory = await getApplicationDocumentsDirectory(); final directoryDir = Directory('${directory.path}/ExternalAudio');