upload.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:dio/dio.dart';
  5. import 'package:path/path.dart' as path;
  6. import 'package:http/http.dart' as http;
  7. import 'package:upload/file_formdata.dart';
  8. import 'file_request.dart';
  9. const String _API_KEY_DEV = "";
  10. const String _FILE_PATH = "\\build\\app\\outputs\\apk\\release\\app-release.apk";
  11. void _log(String message) {
  12. stdout.write(message);
  13. }
  14. Future<void> getToken() async {
  15. _log("\n获取上传token和endpoint中");
  16. final url = Uri.https("www.pgyer.com", "apiv2/app/getCOSToken");
  17. var result = await http.post(url, body: {
  18. "_api_key": "804cf948c5fcf01bc70bb8d086721a58",
  19. "buildType": "android",
  20. });
  21. if (result.statusCode == 200) {
  22. _log("\n获取token和endpoint成功\n");
  23. var json = jsonDecode(result.body)["data"];
  24. final String uploadUrl = json["endpoint"];
  25. final String key = json["key"];
  26. final Map<String, dynamic> params = json["params"];
  27. final String signature = params["signature"];
  28. final String xCosSecurityToken = params["x-cos-security-token"];
  29. await upload2(uploadUrl, key, signature, xCosSecurityToken);
  30. } else {
  31. _log("\n获取token和endpoint失败\n");
  32. }
  33. }
  34. Future<void> upload(
  35. String url,
  36. String key,
  37. String sign,
  38. String token,
  39. ) async {
  40. final endPoint = Uri.tryParse(url);
  41. final file = File(Directory.current.path + _FILE_PATH);
  42. if (endPoint != null) {
  43. var formData = FileRequest("POST", endPoint, (current, total) {
  44. _log("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%");
  45. });
  46. formData.fields["key"] = key;
  47. formData.fields["signature"] = sign;
  48. formData.fields["x-cos-security-token"] = token;
  49. formData.files.add(await http.MultipartFile.fromPath(
  50. path.basename(file.path),
  51. file.path,
  52. ));
  53. _log("\n开始上传APK到蒲公英:${DateTime.now().toString()}\n\n");
  54. var response = await formData.send();
  55. if (response.statusCode == 204) {
  56. _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}");
  57. } else {
  58. _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}");
  59. }
  60. }
  61. }
  62. Future<void> upload2(
  63. String url,
  64. String key,
  65. String sign,
  66. String token,
  67. ) async {
  68. final file = File(Directory.current.path + _FILE_PATH);
  69. var dio = Dio();
  70. dio.options.connectTimeout = 5000;
  71. dio.options.receiveTimeout = 5000;
  72. var form = FileFormData((current, total) {
  73. stdout.write("\r已上传 ${(current / total * 100).toStringAsFixed(2)}%");
  74. });
  75. form.fields.add(MapEntry("key", key));
  76. form.fields.add(MapEntry("signature", sign));
  77. form.fields.add(MapEntry("x-cos-security-token", token));
  78. form.files.add(MapEntry("file", await MultipartFile.fromFile(file.path, filename: path.basename(file.path))));
  79. _log("\n准备开始上传到蒲公英:${DateTime.now().toString()}\n");
  80. var response = await dio.post(
  81. url,
  82. data: form,
  83. options: Options(
  84. method: "POST",
  85. responseType: ResponseType.json,
  86. ),
  87. );
  88. if (response.statusCode == 204) {
  89. _log("\n上传APK到蒲公英完成:${DateTime.now().toString()}");
  90. } else {
  91. _log("\n上传APK到蒲公英失败:${DateTime.now().toString()}");
  92. }
  93. }