import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:path/path.dart' as path; import 'package:http/http.dart' as http; import 'package:upload/file_formdata.dart'; import 'file_request.dart'; const String _API_KEY_DEV = ""; const String _FILE_PATH = "\\build\\app\\outputs\\apk\\release\\app-release.apk"; void _log(String message) { stdout.write(message); } Future getToken() async { _log("\n获取上传token和endpoint中"); final url = Uri.https("www.pgyer.com", "apiv2/app/getCOSToken"); var result = await http.post(url, body: { "_api_key": "804cf948c5fcf01bc70bb8d086721a58", "buildType": "android", }); if (result.statusCode == 200) { _log("\n获取token和endpoint成功\n"); var json = jsonDecode(result.body)["data"]; final String uploadUrl = json["endpoint"]; final String key = json["key"]; final Map params = json["params"]; final String signature = params["signature"]; final String xCosSecurityToken = params["x-cos-security-token"]; await upload2(uploadUrl, key, signature, xCosSecurityToken); } else { _log("\n获取token和endpoint失败\n"); } } Future upload( String url, String key, String sign, String token, ) async { final endPoint = Uri.tryParse(url); final file = File(Directory.current.path + _FILE_PATH); if (endPoint != null) { var formData = FileRequest("POST", endPoint, (current, total) { _log("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%"); }); formData.fields["key"] = key; formData.fields["signature"] = sign; formData.fields["x-cos-security-token"] = token; formData.files.add(await http.MultipartFile.fromPath( path.basename(file.path), file.path, )); _log("\n开始上传APK到蒲公英:${DateTime.now().toString()}\n\n"); var response = await formData.send(); if (response.statusCode == 204) { _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}"); } else { _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}"); } } } Future upload2( String url, String key, String sign, String token, ) async { final file = File(Directory.current.path + _FILE_PATH); var dio = Dio(); dio.options.connectTimeout = 5000; dio.options.receiveTimeout = 5000; var form = FileFormData((current, total) { stdout.write("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%"); }); form.fields.add(MapEntry("key", key)); form.fields.add(MapEntry("signature", sign)); form.fields.add(MapEntry("x-cos-security-token", token)); form.files.add(MapEntry("file", await MultipartFile.fromFile(file.path, filename: path.basename(file.path)))); _log("\n准备开始上传到蒲公英:${DateTime.now().toString()}\n"); var response = await dio.post( url, data: form, options: Options( method: "POST", responseType: ResponseType.json, ), ); if (response.statusCode == 204) { _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}"); } else { _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}"); } }