|
|
|
@ -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'); |
|
|
|
|