uploadMultipartWithData method
Future
uploadMultipartWithData(
{ - required String url,
- Map<String, dynamic>? body,
- Map<String, dynamic>? files,
- CancelToken? cancelToken,
- void onProgressPercentage(
- 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);
}
}