Commit 6b31c590 by tanghuan

测试

1 parent 86fb6411
...@@ -23,6 +23,7 @@ import 'package:appframe/data/repositories/message/scan_code_handler.dart'; ...@@ -23,6 +23,7 @@ import 'package:appframe/data/repositories/message/scan_code_handler.dart';
import 'package:appframe/data/repositories/message/set_title_handler.dart'; import 'package:appframe/data/repositories/message/set_title_handler.dart';
import 'package:appframe/data/repositories/message/storage_handler.dart'; import 'package:appframe/data/repositories/message/storage_handler.dart';
import 'package:appframe/data/repositories/message/upload_file.dart'; import 'package:appframe/data/repositories/message/upload_file.dart';
import 'package:appframe/data/repositories/message/upload_file2.dart';
import 'package:appframe/data/repositories/message/vibrate_short_handler.dart'; import 'package:appframe/data/repositories/message/vibrate_short_handler.dart';
import 'package:appframe/data/repositories/message/video_info_handler.dart'; import 'package:appframe/data/repositories/message/video_info_handler.dart';
import 'package:appframe/data/repositories/message/wifi_info_handler.dart'; import 'package:appframe/data/repositories/message/wifi_info_handler.dart';
...@@ -155,7 +156,8 @@ Future<void> setupLocator() async { ...@@ -155,7 +156,8 @@ Future<void> setupLocator() async {
getIt.registerLazySingleton<MessageHandler>(() => ScanCodeHandler(), instanceName: 'scanCode'); getIt.registerLazySingleton<MessageHandler>(() => ScanCodeHandler(), instanceName: 'scanCode');
/// 上传文件 /// 上传文件
getIt.registerLazySingleton<MessageHandler>(() => UploadFileHandler(), instanceName: 'uploadFile'); // getIt.registerLazySingleton<MessageHandler>(() => UploadFileHandler(), instanceName: 'uploadFile');
getIt.registerLazySingleton<MessageHandler>(() => UploadFile2Handler(), instanceName: 'uploadFile');
/// 下载文件 /// 下载文件
getIt.registerLazySingleton<MessageHandler>(() => DownloadFileHandler(), instanceName: 'downloadFile'); getIt.registerLazySingleton<MessageHandler>(() => DownloadFileHandler(), instanceName: 'downloadFile');
......
...@@ -6,10 +6,13 @@ import 'package:appframe/services/dispatcher.dart'; ...@@ -6,10 +6,13 @@ import 'package:appframe/services/dispatcher.dart';
import 'package:appframe/utils/file_type_util.dart'; import 'package:appframe/utils/file_type_util.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class UploadFileHandler extends MessageHandler { class UploadFileHandler extends MessageHandler {
static final upLogger = Logger(level: Level.debug);
@override @override
Future handleMessage(params) async { Future handleMessage(params) async {
if (params is! Map<String, dynamic>) { if (params is! Map<String, dynamic>) {
...@@ -29,10 +32,19 @@ class UploadFileHandler extends MessageHandler { ...@@ -29,10 +32,19 @@ class UploadFileHandler extends MessageHandler {
if (subBusi == null || subBusi.isEmpty) { if (subBusi == null || subBusi.isEmpty) {
throw Exception('参数错误'); throw Exception('参数错误');
} }
final startTimestamp = DateTime.now().millisecondsSinceEpoch;
upLogger.d('开始上传文件');
final result = await compute(_handleUpload, {'filePath': tempFilePath, 'busi': busi, 'subBusi': subBusi}); final result = await compute(_handleUpload, {'filePath': tempFilePath, 'busi': busi, 'subBusi': subBusi});
// final result = await _handleUpload({'filePath': tempFilePath}); // final result = await _handleUpload({'filePath': tempFilePath});
final endTimestamp = DateTime.now().millisecondsSinceEpoch;
upLogger.d('上传完成,耗时:${endTimestamp - startTimestamp} 毫秒');
result['startTimestamp'] = startTimestamp;
result['sendTimestamp'] = endTimestamp;
return result; return result;
} }
...@@ -47,12 +59,6 @@ class UploadFileHandler extends MessageHandler { ...@@ -47,12 +59,6 @@ class UploadFileHandler extends MessageHandler {
String busi = fileParams['busi'] as String; String busi = fileParams['busi'] as String;
String subBusi = fileParams['subBusi'] as String; String subBusi = fileParams['subBusi'] as String;
print('参数-------');
print('filePath:$filePath ');
print('busi:$busi ');
print('subBusi:$subBusi ');
print('参数-------');
if (filePath.startsWith(Constant.localServerUrl)) { if (filePath.startsWith(Constant.localServerUrl)) {
filePath = filePath.replaceFirst(Constant.localServerUrl, ''); filePath = filePath.replaceFirst(Constant.localServerUrl, '');
} }
...@@ -67,18 +73,23 @@ class UploadFileHandler extends MessageHandler { ...@@ -67,18 +73,23 @@ class UploadFileHandler extends MessageHandler {
final obsApiService = ApiService(defaultHeaders: {'Content-Type': '', 'Accept': ''}); final obsApiService = ApiService(defaultHeaders: {'Content-Type': '', 'Accept': ''});
String logicPrefix = _getLoginPrefix(busi, subBusi); String logicPrefix = _getLoginPrefix(busi, subBusi);
print('logicPrefix: $logicPrefix');
//并行上传分段 //并行上传分段
final uploadResult = await _uploadInParallel(bxeApiService, obsApiService, logicPrefix, filePath); upLogger.d("开始处理并行上传");
final uploadResult =
await _uploadInParallel(bxeApiService, obsApiService, logicPrefix, filePath, maxConcurrency: 30);
upLogger.d("并行上传完成");
// 上传结果
String objectKey = uploadResult['objectKey'] as String; String objectKey = uploadResult['objectKey'] as String;
String bucket = uploadResult['bucket'] as String; String bucket = uploadResult['bucket'] as String;
String uploadId = uploadResult['uploadId'] as String; String uploadId = uploadResult['uploadId'] as String;
Map<int, String> tagsMap = uploadResult['tagsMap'] as Map<int, String>; Map<int, String> tagsMap = uploadResult['tagsMap'] as Map<int, String>;
//请求合并文件 //请求合并文件
upLogger.d("开始处理合并文件");
String location = await _merge(bxeApiService, objectKey, bucket, uploadId, tagsMap); String location = await _merge(bxeApiService, objectKey, bucket, uploadId, tagsMap);
print('location: $location'); upLogger.d("合并文件完成");
//关闭Dio //关闭Dio
bxeApiService.close(); bxeApiService.close();
...@@ -106,10 +117,15 @@ class UploadFileHandler extends MessageHandler { ...@@ -106,10 +117,15 @@ class UploadFileHandler extends MessageHandler {
throw Exception('上传的文件过大'); throw Exception('上传的文件过大');
} }
upLogger.d('文件大小:$fileSize');
//分段大小2M //分段大小2M
final chunkSize = Constant.obsUploadChunkSize; final chunkSize = Constant.obsUploadChunkSize;
upLogger.d('分段大小:$chunkSize');
//分段总数 //分段总数
final totalChunks = (fileSize / chunkSize).ceil(); final totalChunks = (fileSize / chunkSize).ceil();
upLogger.d('分段总数:$totalChunks');
final randomAccessFile = file.openSync(); final randomAccessFile = file.openSync();
...@@ -127,14 +143,16 @@ class UploadFileHandler extends MessageHandler { ...@@ -127,14 +143,16 @@ class UploadFileHandler extends MessageHandler {
// String objectKey = 'd2/test/file.csv'; // String objectKey = 'd2/test/file.csv';
var uuid = Uuid(); var uuid = Uuid();
String objectKey = '$logicPrefix/${uuid.v4()}${path.extension(file.path)}'; String objectKey = '$logicPrefix/${uuid.v4()}${path.extension(file.path)}';
print('objectKey: $objectKey');
String uploadId = ''; String uploadId = '';
Map<int, String> tagsMap = {}; Map<int, String> tagsMap = {};
final futures = <Future>[]; final futures = <Future>[];
for (int i = 0; i < totalChunks; i++) { for (int i = 0; i < totalChunks; i++) {
upLogger.d('开始处理分段:$i');
// 控制并发数量 // 控制并发数量
if (futures.length >= maxConcurrency) { if (futures.length >= maxConcurrency) {
upLogger.d('超过最大并发数量,等待');
await Future.wait(futures); await Future.wait(futures);
futures.clear(); futures.clear();
} }
...@@ -146,6 +164,7 @@ class UploadFileHandler extends MessageHandler { ...@@ -146,6 +164,7 @@ class UploadFileHandler extends MessageHandler {
randomAccessFile.setPositionSync(start); randomAccessFile.setPositionSync(start);
await randomAccessFile.readInto(chunk, 0, actualChunkSize); await randomAccessFile.readInto(chunk, 0, actualChunkSize);
final startTime = DateTime.now().millisecondsSinceEpoch;
String chunkSignUrl; String chunkSignUrl;
if (i == 0) { if (i == 0) {
final initResult = await _init(bxeApiService, objectKey, bucket); final initResult = await _init(bxeApiService, objectKey, bucket);
...@@ -155,7 +174,8 @@ class UploadFileHandler extends MessageHandler { ...@@ -155,7 +174,8 @@ class UploadFileHandler extends MessageHandler {
final nextResult = await _next(bxeApiService, objectKey, bucket, uploadId, i + 1); final nextResult = await _next(bxeApiService, objectKey, bucket, uploadId, i + 1);
chunkSignUrl = nextResult['signed_url'] as String; chunkSignUrl = nextResult['signed_url'] as String;
} }
print('chunkSignUrl: $chunkSignUrl'); final endTime = DateTime.now().millisecondsSinceEpoch;
upLogger.d('分段$i,签名耗时:${endTime - startTime} 毫秒');
// await _uploadChunkWithRetry(obsApiService, chunkSignUrl, i, chunk, tagsMap); // await _uploadChunkWithRetry(obsApiService, chunkSignUrl, i, chunk, tagsMap);
final future = _uploadChunkWithRetry(obsApiService, chunkSignUrl, i, chunk, tagsMap); final future = _uploadChunkWithRetry(obsApiService, chunkSignUrl, i, chunk, tagsMap);
...@@ -165,6 +185,7 @@ class UploadFileHandler extends MessageHandler { ...@@ -165,6 +185,7 @@ class UploadFileHandler extends MessageHandler {
// 等待剩余的上传完成 // 等待剩余的上传完成
if (futures.isNotEmpty) { if (futures.isNotEmpty) {
await Future.wait(futures); await Future.wait(futures);
futures.clear();
} }
randomAccessFile.closeSync(); randomAccessFile.closeSync();
...@@ -200,12 +221,17 @@ class UploadFileHandler extends MessageHandler { ...@@ -200,12 +221,17 @@ class UploadFileHandler extends MessageHandler {
Map<int, String> tagsMap, { Map<int, String> tagsMap, {
int maxRetries = 3, int maxRetries = 3,
}) async { }) async {
final start = DateTime.now().millisecondsSinceEpoch;
upLogger.d('分段$chunkIndex,开始时间:$start毫秒');
for (int attempt = 0; attempt <= maxRetries; attempt++) { for (int attempt = 0; attempt <= maxRetries; attempt++) {
try { try {
final resp = await _uploadChunk(obsApiService, signUrl, chunk); final resp = await _uploadChunk(obsApiService, signUrl, chunk, chunkIndex);
if (resp.statusCode == 200) { if (resp.statusCode == 200) {
final etags = resp.headers['etag'] as List<String>; final etags = resp.headers['etag'] as List<String>;
tagsMap[chunkIndex + 1] = etags[0]; tagsMap[chunkIndex + 1] = etags[0];
final end = DateTime.now().millisecondsSinceEpoch;
upLogger.d('分段$chunkIndex,上传段耗时:${end - start}毫秒');
return; // 上传成功 return; // 上传成功
} else { } else {
throw Exception('Chunk $chunkIndex upload failed: ${resp.statusCode}'); throw Exception('Chunk $chunkIndex upload failed: ${resp.statusCode}');
...@@ -221,14 +247,18 @@ class UploadFileHandler extends MessageHandler { ...@@ -221,14 +247,18 @@ class UploadFileHandler extends MessageHandler {
} }
/// 上传段 /// 上传段
static Future<Response> _uploadChunk(ApiService obsApiService, String signUrl, Uint8List chunk) async { static Future<Response> _uploadChunk(
ApiService obsApiService, String signUrl, Uint8List chunk, int chunkIndex) async {
final start = DateTime.now().millisecondsSinceEpoch;
upLogger.d('分段$chunkIndex,处理开始时间 $start');
var url = signUrl.replaceFirst('AWSAccessKeyId=', 'AccessKeyId=').replaceFirst(':443', ''); var url = signUrl.replaceFirst('AWSAccessKeyId=', 'AccessKeyId=').replaceFirst(':443', '');
try { try {
Response response = await obsApiService.put(url, chunk); Response response = await obsApiService.put(url, chunk);
final end = DateTime.now().millisecondsSinceEpoch;
upLogger.d('分段$chunkIndex,处理完成时间:${end - start}毫秒');
return response; return response;
} catch (e) { } catch (e) {
print('Chunk upload failed: $e');
throw Exception('Chunk upload failed: $e'); throw Exception('Chunk upload failed: $e');
} }
} }
......
...@@ -8,7 +8,7 @@ import 'app.dart'; ...@@ -8,7 +8,7 @@ import 'app.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await setupLocator(); await setupLocator();
await registerMqtt(); // await registerMqtt();
await initDatabase(); await initDatabase();
runApp(const App()); runApp(const App());
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!