uploadMergedMessageFile static method
合并并上传消息,返回上传后的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);
}
}