upgrade_handler.dart
1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import 'dart:io';
import 'package:appframe/services/dispatcher.dart';
import 'package:archive/archive.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
class UpgradeHandler extends MessageHandler {
@override
Future<dynamic> handleMessage(params) async {
if (params is! Map<String, dynamic>) {
throw Exception('参数错误');
}
final url = params['url'] as String;
final version = params['version'] as String;
// 1 下载
Directory? direct;
if (Platform.isAndroid) {
direct = await getExternalStorageDirectory();
} else if (Platform.isIOS || Platform.isMacOS) {
direct = await getApplicationDocumentsDirectory();
} else {
throw Exception('未知平台');
}
var saveFilePath = '${direct?.path}/dist_$version.zip';
var dio = Dio();
final resp = await dio.download(
url,
saveFilePath,
onReceiveProgress: (received, total) {
if (total != -1) {
print((received / total * 100).toStringAsFixed(0) + "%");
}
},
);
dio.close();
if (resp.statusCode != 200) {
throw Exception('文件下载失败');
}
// 2 解压
var outputDirectory = '${direct?.path}/http_dist_assets';
await _extract(saveFilePath, outputDirectory);
}
Future<void> _extract(String zipFilePath, String outputDirectory) async {
var file = File(zipFilePath);
var bytes = await file.readAsBytes();
// 解码 ZIP 文件
final archive = ZipDecoder().decodeBytes(bytes);
// 提取文件到指定目录
for (final file in archive) {
final filename = file.name;
if (file.isFile) {
final data = file.content as List<int>;
final outputFile = File('$outputDirectory/$filename');
outputFile.createSync(recursive: true);
outputFile.writeAsBytesSync(data);
} else {
// 创建目录
Directory('$outputDirectory/$filename').createSync(recursive: true);
}
}
}
}