王士博
unread,Nov 28, 2022, 3:52:14 AM11/28/22Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Dart Misc
Hello, everyone, I used RandomAccessFile to upload large files, and then upload the process of prompt out of memory. Is there any solution?
this is my code:
getPaging(
CancelRequest cancelRequest, path, uploadId, fileName, WJDataType type,
{Function? uploadVideoUrl,
String? unitGuid,
int pageFileSize = 0,
int? totalSize,
int number = 0,
String? md5Srting,
Function(int, int, int)? callBack}) async {
// var s = await File(path).readAsBytes();
File file = File(path);
int x = pageFileSize;
var s = await file.open();
int size = await file.length();
List<int> val = [];
int num = size % EndPoints.chunkSize > 0 ? 1 : 0;
int num1 = size ~/ EndPoints.chunkSize + num;
int num2;
if (number > 1) {
num2 = number - 1;
} else {
num2 = 0;
}
bool isTrue = true;
var response;
// bool isBreak = false;
// Stream stream;
while (x < size) {
if (!cancelRequest.isPaused) {
int _len =
size - x >= EndPoints.chunkSize ? EndPoints.chunkSize : size - x;
num2++;
bool lastChunk = num1 != num2 ? false : true;
// val = s.sublist(x,x+_len);
// val = await IsoLateTools().filePage(data: {'file':s,'length':_len,'start':x});
// val = await getRange(path, x, x+_len);
await s.setPosition(x);
val = await s.read(_len);
x = x + _len;
wjLogString(
msg: "2: ${val.runtimeType}-----$num1------$num2----$lastChunk");
try {
dio.MultipartFile multipartFile = dio.MultipartFile.fromBytes(
Uint8List.fromList(val),
filename: "$num2$fileName");
Map<String, dynamic> tempMap = {
"multipartFile": multipartFile,
"uploadId": uploadId,
"fileName": "$fileName",
"fileSort": num2,
"fileSortCounts": num1,
"lastChunk": lastChunk
};
dio.FormData formData = dio.FormData.fromMap(tempMap);
response = await WJHttpInstance.requestMethod(EndPoints.uploadPart,
type: RequestType.post,
data: formData, onSendProgress: (value1, value2) {
if (callBack != null) {
callBack(value1, value2, _len);
}
}, contentType: 'multipart/form-data');
if (response.data['code'] != 200) {
isTrue = false;
cancelRequest.changePaused(true);
EasyLoading.showError("网络出错了,上传失败!");
wjLogString(msg: "已存储的大小:$x,总的文件大小:$size");
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "网络出错时存储的数据model1:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
s.closeSync();
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
} else {
EasyLoading.dismiss();
if (lastChunk) {
if (cancelRequest.isPaused) {
EasyLoading.showToast('数据即将上传完成,请稍等...');
}
cancelRequest.changePaused(false);
s.closeSync();
} else {
if (cancelRequest.isPaused) {
EasyLoading.show(status: "数据存储中请稍后...");
wjLogString(msg: "已存储的大小:$x,总的文件大小:$size");
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "暂停上传后存储的model值:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
} else {
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "实时存储的model值:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
wjLogString(msg: "数据存储成功");
});
});
} catch (e) {
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
}
}
wjLogString(msg: '已经上传的大小:${num2 * EndPoints.chunkSize}');
}
} catch (e) {
isTrue = false;
cancelRequest.changePaused(true);
EasyLoading.showError("网络出错了,上传失败!");
wjLogString(msg: "当前分片的位置num2:$num2,已存储的大小:$x,总的文件大小:$size-----$e");
s.closeSync();
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model2 = TodoModdel();
model2 = value;
model2.uploadId = uploadId;
model2.number = num2;
model2.size = x;
wjLogString(msg: "网络出错时存储的数据model2:${model2.toMap()}");
SqliteTools.update(model2).then((value1) {
wjLogString(msg: "网络出错时更新数据返回的数据value1:$value1");
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
}
}
if (!cancelRequest.isPaused) {
wjLogString(msg: "${response.data['data']}");
wjLogString(msg: "size:$size");
if (isTrue) {
var uploadPath = response.data["data"];
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model2 = TodoModdel();
model2 = value;
model2.urlString = uploadPath;
SqliteTools.update(model2).then((value1) {
wjLogString(msg: "上传成功合并成功后存储的Model2:${model2.toMap()}");
});
});
} catch (e) {
wjLogString(msg: "上传完成时存储urlString的报错信息$e");
}
uploadVideoUrl!(uploadPath, size);
await s.close();
} else {
EasyLoading.showError("出错了,请重新上传!");
}
}
}