upload method

Future<void> upload(
  1. Uint8List imgData,
  2. String? filePath
)

Implementation

Future<void> upload(Uint8List imgData, String? filePath) async {
  // 设置URL
  final String apiUrl = '${_baseApiUrl}/v1/assets/upload-v4';

  var ext = "";
  if (filePath != null) {
    ext = (filePath?.split(".").last ?? "#").toLowerCase();

    if (!imageTypes.contains(ext) &&
        !fileTypes.contains(ext) &&
        !videoTypes.contains(ext)) {
      _listener?.uploadFailed("不支持的文件格式");
      return;
    }
  }

  Dio dio = Dio();
  // 设置 Dio 的一些默认配置(如果需要)
  dio.options.connectTimeout = const Duration(minutes: 10);
  dio.options.receiveTimeout = const Duration(minutes: 15); // 接收超时
  dio.options.sendTimeout = const Duration(minutes: 15); // 接收超时
  //dio.interceptors.add(CustomInterceptors());
  uploadProgress = 1;
  _listener?.updateProgress(uploadProgress);

  dio.options.headers = {
    'Content-Type': 'multipart/form-data',
    'Accept': 'multipart/form-data',
    'X-Token': xToken,
  };

  final String fileName = '${DateTime
      .now().millisecondsSinceEpoch}.${ext}';

  // 创建表单数据
  FormData formData = FormData.fromMap({
    'type': '4',
    'myFile': MultipartFile.fromBytes(
      imgData,
      filename: fileName,
    ),
  });

  debugPrint('xToken=$xToken');
  try {
    //SmartDialog.showLoading(msg: "上传中");
    //Constant.instance.chatLib.idleTimes = 0;
    final Response response = await dio.post(apiUrl, data: formData,
        onSendProgress: (int sent, int total) {
          // debugPrint(
          //     'Upload Progress: ${(sent / total * 100).toStringAsFixed(
          //         0)}% ${DateTime.now()}');
        }, onReceiveProgress: (int rece, int total) {
          // debugPrint(
          //     'Receive Progress: ${(rece / total * 100).toStringAsFixed(
          //         0)}% ${DateTime.now()}');
        });
    //Constant.instance.chatLib.idleTimes = 0;
    if (response.statusCode == 200) {
      final responseData = response.data is String
          ? jsonDecode(response.data)
          : response.data;
      var result = re.Result<re.FilePath>.fromJson(
        responseData,
            (json) => re.FilePath.fromJson(json as Map<String, dynamic>),
      );
      final String filePath = result.data?.filePath ?? "";
      debugPrint(filePath);
      if (filePath.isNotEmpty) {
        var urls = Urls();
        urls.uri = filePath;
        urls.size = imgData.length;
        urls.fileName = fileName;
        _listener?.uploadSuccess(urls);
      }
      print('上传成功: $filePath ${DateTime.now()}');
    } else if (response.statusCode == 202) {
      if (uploadProgress < 70){
        uploadProgress = 70;
      }else{
        uploadProgress += 10;
      }
      _listener?.updateProgress(uploadProgress);
      final responseData = response.data is String
          ? jsonDecode(response.data)
          : response.data;
      var result = re.Result<String>.fromJson(
        responseData as Map<String, dynamic>, // Cast to Map<String, dynamic>
            (json) => json as String, //
      );
      print('获得上传地址=${ result.data ?? ""}');
      subscribeToSee(apiUrl + "?uploadId=${ result.data ?? ""}");
    } else {
      print('上传失败:${response.statusMessage}');
      _listener?.uploadFailed('上传失败:${response.statusCode} - ${response.statusMessage}');
    }
  } catch (e) {
    _listener?.uploadFailed('上传失败:${e.toString()}');
    print('上传失败:$e ${DateTime.now()}');
  } finally {
    print('上传 finally ${DateTime.now()}');
  }
}