Commit 647ceae6 by tanghuan

继续优化错误场景的处理

1 parent 2d9db329
...@@ -85,6 +85,10 @@ class UploadStartHandler extends MessageHandler { ...@@ -85,6 +85,10 @@ class UploadStartHandler extends MessageHandler {
} on ParamErrorException { } on ParamErrorException {
debugPrint('====================>上传失败:参数错误'); debugPrint('====================>上传失败:参数错误');
throw Exception('参数错误'); throw Exception('参数错误');
} on ChunkSigException {
debugPrint('====================>上传失败:签名错误');
// 确保发送了 uploadEnd 指令
_webCubit?.sendUploadEnd(_cmdUnique, _cmdUploadId, '', errMsg: '网络错误,签名失败');
} on ChunkUploadFailedException { } on ChunkUploadFailedException {
debugPrint('====================>上传失败:网络错误'); debugPrint('====================>上传失败:网络错误');
// 确保发送了 uploadEnd 指令 // 确保发送了 uploadEnd 指令
...@@ -331,9 +335,13 @@ class UploadStartHandler extends MessageHandler { ...@@ -331,9 +335,13 @@ class UploadStartHandler extends MessageHandler {
/// 初始化,请求后端获取签名信息和上传任务ID /// 初始化,请求后端获取签名信息和上传任务ID
Future<Map<String, dynamic>> _init(ApiService bxeApiService, String objectKey, String bucket) async { Future<Map<String, dynamic>> _init(ApiService bxeApiService, String objectKey, String bucket) async {
var endpoint = '$_signatureNewUrl?objectKey=$objectKey&bucket=$bucket'; try {
final resp = await bxeApiService.get(endpoint); var endpoint = '$_signatureNewUrl?objectKey=$objectKey&bucket=$bucket';
return resp.data; final resp = await bxeApiService.get(endpoint);
return resp.data;
} catch (e) {
throw ChunkSigException('初始化上传任务失败: $e');
}
} }
/// 每次上传前,请求后端获取签名信息 /// 每次上传前,请求后端获取签名信息
...@@ -344,9 +352,13 @@ class UploadStartHandler extends MessageHandler { ...@@ -344,9 +352,13 @@ class UploadStartHandler extends MessageHandler {
String uploadId, String uploadId,
int partNum, int partNum,
) async { ) async {
var endpoint = '$_signatureNextUrl?objectKey=$objectKey&bucket=$bucket&uploadId=$uploadId&partNum=$partNum'; try {
final resp = await bxeApiService.get(endpoint); var endpoint = '$_signatureNextUrl?objectKey=$objectKey&bucket=$bucket&uploadId=$uploadId&partNum=$partNum';
return resp.data; final resp = await bxeApiService.get(endpoint);
return resp.data;
} catch (e) {
throw ChunkSigException('获取签名信息失败: $e');
}
} }
/// 上传段(带进度回调) /// 上传段(带进度回调)
...@@ -374,13 +386,13 @@ class UploadStartHandler extends MessageHandler { ...@@ -374,13 +386,13 @@ class UploadStartHandler extends MessageHandler {
return {'idx': chunkIndex + 1, 'etag': etags[0]}; return {'idx': chunkIndex + 1, 'etag': etags[0]};
} else { } else {
// throw Exception('Chunk $chunkIndex upload failed: ${resp.statusCode}'); // throw Exception('Chunk $chunkIndex upload failed: ${resp.statusCode}');
throw Exception('Chunk upload failed'); throw ChunkUploadFailedException('Chunk upload failed');
} }
} catch (e) { } catch (e) {
debugPrint('====================> 分片$chunkIndex${attempt + 1}次, 上传失败:${e.toString()}'); debugPrint('====================> 分片$chunkIndex${attempt + 1}次, 上传失败:${e.toString()}');
if (attempt == maxRetries) { if (attempt == maxRetries) {
// throw Exception('Chunk $chunkIndex upload failed after $maxRetries attempts: $e'); // throw Exception('Chunk $chunkIndex upload failed after $maxRetries attempts: $e');
throw Exception('Chunk upload failed'); throw ChunkUploadFailedException('Chunk upload failed');
} }
// 等待后重试 // 等待后重试
await Future.delayed(Duration(seconds: 2 * (attempt + 1))); await Future.delayed(Duration(seconds: 2 * (attempt + 1)));
...@@ -440,7 +452,7 @@ class UploadStartHandler extends MessageHandler { ...@@ -440,7 +452,7 @@ class UploadStartHandler extends MessageHandler {
return response; return response;
} catch (e) { } catch (e) {
// throw Exception('Chunk upload failed: $e'); // throw Exception('Chunk upload failed: $e');
throw Exception('Chunk upload failed'); throw ChunkUploadFailedException('Chunk upload failed');
} }
} }
...@@ -452,23 +464,30 @@ class UploadStartHandler extends MessageHandler { ...@@ -452,23 +464,30 @@ class UploadStartHandler extends MessageHandler {
String uploadId, String uploadId,
Map<int, String> tagsMap, Map<int, String> tagsMap,
) async { ) async {
final parts = []; try {
for (int i = 1; i <= tagsMap.length; i++) { final parts = [];
parts.add({'partNumber': i, 'etag': tagsMap[i]}); for (int i = 1; i <= tagsMap.length; i++) {
} parts.add({'partNumber': i, 'etag': tagsMap[i]});
}
final response = await bxeApiService.post(_completeUrl, { final response = await bxeApiService.post(_completeUrl, {
'objectKey': objectKey, 'objectKey': objectKey,
'bucket': bucket, 'bucket': bucket,
'uploadId': uploadId, 'uploadId': uploadId,
'parts': parts, 'parts': parts,
}); });
if (response.statusCode != 200) { if (response.statusCode != 200) {
throw Exception('合并文件失败'); throw ChunkSigException('合并文件失败');
} }
return response.data["location"]; return response.data["location"];
} catch (e) {
if (e is ChunkSigException) {
rethrow;
}
throw ChunkSigException('合并文件失败: $e');
}
} }
String _getLoginPrefix(String busi, String subBusi) { String _getLoginPrefix(String busi, String subBusi) {
......
...@@ -7,6 +7,15 @@ class ParamErrorException implements Exception { ...@@ -7,6 +7,15 @@ class ParamErrorException implements Exception {
String toString() => 'ParamErrorException: $message'; String toString() => 'ParamErrorException: $message';
} }
class ChunkSigException implements Exception {
final String message;
ChunkSigException([this.message = '签名失败']);
@override
String toString() => 'ChunkSigException: $message';
}
class ChunkUploadFailedException implements Exception { class ChunkUploadFailedException implements Exception {
final String message; final String message;
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!