Browse Source

fix(meeting): 优化文件处理逻辑以避免内存溢出

修改文件选择逻辑,使用文件路径而非字节数据来处理音频文件
新增流式复制文件方法,分块处理大文件避免内存问题
移除旧的_saveFile方法,替换为更高效的_copyFileToLocal
weicu
lxm 1 year ago
parent
commit
329828b748
  1. 49
      lib/modules/meeting/controllers/meeting_home_controller.dart

49
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<String> _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<String> _saveFile(PlatformFile file) async {
final directory = await getApplicationDocumentsDirectory();
final directoryDir = Directory('${directory.path}/ExternalAudio');

Loading…
Cancel
Save