uploadMultipartWithData method

Future uploadMultipartWithData({
  1. required String url,
  2. Map<String, dynamic>? body,
  3. Map<String, dynamic>? files,
  4. Map<String, dynamic>? headers,
  5. CancelToken? cancelToken,
  6. void onProgressPercentage(
    1. double progress
    )?,
})

Implementation

Future<dynamic> uploadMultipartWithData({
  required String url,
  Map<String, dynamic>? body,
  Map<String, dynamic>? files,
  Map<String, dynamic>? headers,
  CancelToken? cancelToken,
  void Function(double progress)? onProgressPercentage,
}) async {
  try {
    /// ALWAYS create a new map
    final Map<String, dynamic> formMap = {...?body};

    /// Add files only if present
    if (files != null && files.isNotEmpty) {
      for (final entry in files.entries) {
        final key = entry.key;
        final value = entry.value;

        /// Single file
        if (value is String && value.isNotEmpty) {
          formMap[key] = await MultipartFile.fromFile(
            value,
            filename: value.split('/').last,
          );
        }
        /// Multiple files
        else if (value is List<String> && value.isNotEmpty) {
          formMap[key] = await Future.wait(
            value.map(
              (path) => MultipartFile.fromFile(
                path,
                filename: path.split('/').last,
              ),
            ),
          );
        }
      }
    }

    final formData = FormData.fromMap(formMap);

    debugPrint("FORM DATA KEYS => ${formData.fields.map((e) => e.key)}");
    debugPrint("FORM FILES => ${formData.files.map((e) => e.key)}");

    final response = await _dio.post(
      url,
      data: formData,
      options: Options(headers: headers),
      cancelToken: cancelToken,
      onSendProgress: (sent, total) {
        if (total > 0 && onProgressPercentage != null) {
          onProgressPercentage((sent / total) * 100);
        }
      },
    );
    debugPrint("RESPONSE DATA => ${response.data}");

    return response.data;
  } on DioException catch (e) {
    throw _handleDioError(e);
  }
}