From e0d5679049f85e4ac22b7d79b94859a06ee16d6b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 15 Sep 2025 17:35:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(meeting):=20=E4=BC=98=E5=8C=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=BB=A5=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=86=85=E5=AD=98=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件选择逻辑,使用文件路径而非字节数据来处理音频文件 新增流式复制文件方法,分块处理大文件避免内存问题 移除旧的_saveFile方法,替换为更高效的_copyFileToLocal --- .../controllers/meeting_home_controller.dart | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) 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');