postMultipart2 method
Implementation
Future<PlexApiResponse> postMultipart2(
String url, {
Map<String, dynamic>? query,
Map<String, String>? headers,
required Map<String, String> formData,
required Map<String, File> files,
}) async {
if (await isNetworkAvailable() == false) {
return _noNetwork;
}
/// Construct query parameters if present
if (query?.isNotEmpty == true) {
url += "?${query!.entries.map((e) => "${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value.toString())}").join("&")}";
}
/// Prepare headers
var currentHeaders = <String, String>{};
if (addHeaders != null) {
var constHeaders = await addHeaders!.call();
currentHeaders.addAll(constHeaders);
}
if (headers != null) {
currentHeaders.addAll(headers);
}
// ✅ Do not manually set Content-Type for multipart requests
if (kDebugMode) print("Headers: $currentHeaders");
try {
var uri = Uri.parse(_isValidUrl(url) ? url : _apiUrl() + url);
if (kDebugMode) print("Started: ${uri.toString()}");
/// Prepare Multipart Request
var request = http.MultipartRequest('POST', uri);
request.headers.addAll(currentHeaders);
request.fields.addAll(formData);
/// Attach Files
for (var entry in files.entries) {
var multipartFile = await http.MultipartFile.fromPath(entry.key, entry.value.path);
request.files.add(multipartFile);
}
var streamedResponse = await request.send();
var responseBody = await streamedResponse.stream.transform(utf8.decoder).join();
if (kDebugMode) print("Completed: ${streamedResponse.statusCode}: ${responseBody.toString()}");
/// Handle JSON & Text Responses Correctly
if (streamedResponse.statusCode == 200) {
try {
return PlexSuccess(responseBody); /// Return JSON if valid
} catch (e) {
return PlexSuccess(responseBody); /// Otherwise, return as plain text
}
} else {
return PlexError(
streamedResponse.statusCode,
responseBody.isEmpty ? streamedResponse.reasonPhrase ?? "Unknown error" : responseBody,
);
}
} catch (e) {
if (e is SocketException) {
return _connectionFailed;
}
if (kDebugMode) print("Error: ${e.toString()}");
return PlexError(400, e.toString());
}
}