postMultipart method
Implementation
Future<PlexApiResponse> postMultipart(
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;
}
if (query?.isNotEmpty == true) {
url += "?";
query?.forEach((key, value) {
url += "$key=$value&";
});
url = url.substring(0, url.length - 1);
}
headers ??= <String, String>{};
if (formData == null) {
headers["Content-Type"] = "application/json";
}
if (addHeaders != null) {
var constHeaders = await addHeaders!.call();
headers.addAll(constHeaders);
}
try {
var uri = Uri.parse(_isValidUrl(url) ? url : _apiUrl() + url);
if (kDebugMode) print("Started: ${uri.toString()}");
var multipartFiles = List<http.MultipartFile>.empty(growable: true);
var filesKeys = files.keys.toList();
for (var i = 0; i < filesKeys.length; i++) {
var multipart = await http.MultipartFile.fromPath(filesKeys[i], files[filesKeys[i]]!.path);
multipartFiles.add(multipart);
}
var request = http.MultipartRequest('POST', uri);
request.fields.addAll(formData);
request.files.addAll(multipartFiles);
var data = await request.send();
if (kDebugMode) print("Completed: ${data.statusCode}: ${uri.toString()}");
if (data.statusCode == 200) {
var responseBody = await data.stream.transform(utf8.decoder).join();
return PlexSuccess(responseBody);
} else {
var responseBody = await data.stream.transform(utf8.decoder).join();
if (responseBody.isEmpty) {
return PlexError(data.statusCode, data.reasonPhrase ?? responseBody);
}
return PlexError(data.statusCode, responseBody);
}
} catch (e) {
if(e is SocketException) {
return _connectionFailed;
}
if (kDebugMode) print("Error: ${e.toString()}");
return PlexError(400, e.toString());
}
}