uploadFile<T> method
Future<Either<ApiError, T>>
uploadFile<T>(- String path,
- T conversionFunc(
- dynamic json
),
- {required List<File> files,
- List<String> fieldName = const ["file"],
- Map<String, String>? fields,
- Map<String, dynamic>? requestBody,
- Map<String, String>? queryParameters,
- Duration? timeoutDuration}
)
Implementation
Future<Either<ApiError, T>> uploadFile<T>(
String path, T Function(dynamic json) conversionFunc,
{required List<File> files,
List<String> fieldName = const ["file"],
Map<String, String>? fields,
Map<String, String>? headers,
Map<String, dynamic>? requestBody,
Map<String, String>? queryParameters,
Duration? timeoutDuration}) async {
assert(files.length == fieldName.length);
final uri = Uri.parse((_baseUrl ?? "") +
path +
(queryParameters?.entries
.map((entry) => "${entry.key}=${entry.value}")
.fold("?", (previous, current) {
if (previous == "?") {
return "?$current";
}
return "$previous&$current";
}) ??
""));
final request = http.MultipartRequest("POST", uri);
for (int i = 0; i < files.length; i++) {
final mimeType = getMimeTypeForFile(files[i].path);
final parts = mimeType.split('/');
print("PART : $parts");
final multipartFile = await http.MultipartFile.fromPath(
fieldName[i],
files[i].path,
contentType: MediaType(parts[0], parts[i]),
);
request.files.add(multipartFile);
}
if (fields != null) {
request.fields.addAll(fields);
}
request.headers.addAll({
...?_defaultHeaders,
if (_accessToken != null) "Authorization": "Bearer $_accessToken",
...?headers,
});
try {
final streamedResponse = await request
.send()
.timeout(timeoutDuration ?? const Duration(seconds: 60));
final response = await http.Response.fromStream(streamedResponse);
return _handleApiResult(Future.value(response), path)
.mapRight(conversionFunc);
} catch (e) {
return Left(ApiError(
httpErrorCode: 500,
message: e.toString(),
apiStatusCode: "Error on upload file"));
}
}