upload method
Uploads data to the server.
This method uploads data (typically files) to the server. Progress can be
tracked using the optional onProgress callback.
Parameters:
request: The request configuration for the upload, including the data to uploadonProgress: Optional callback to track upload progress
Returns a Future that completes with an AdapterResponse when the upload is complete.
Throws AdapterException if the upload fails.
Example:
final request = AdapterRequest(
baseUrl: 'https://api.example.com',
path: '/upload',
method: HttpMethod.post,
bodyParams: {'file': File('/path/to/file.jpg')},
);
await adapter.upload(
request,
onProgress: (count, total) {
print('Uploaded: ${(count / total * 100).toStringAsFixed(1)}%');
},
);
Implementation
@override
Future<AdapterResponse> upload(
AdapterRequest request, {
ProgressCallback? onProgress,
}) async {
final completer = Completer<void>();
try {
final baseRequest = await _buildBaseRequest(
request,
onProgress: onProgress,
);
if (request.cancelToken != null) {
_registerCancelToken(request.cancelToken!, completer);
if (request.cancelToken!.isCancelled) {
throw AdapterException.cancel(
message: request.cancelToken!.cancelReason,
);
}
}
final requestFuture = _client.send(baseRequest);
final streamedResponse = request.cancelToken != null
? await Future.any<http.StreamedResponse>([
requestFuture,
completer.future.then((_) => throw AdapterException.cancel(
message: request.cancelToken!.cancelReason,
)),
])
: await requestFuture;
if (request.responseType == ResponseType.stream) {
final response = _convertFromHttpStreamedResponse(
streamedResponse,
request,
);
if (!response.isSuccess) {
throw AdapterException(
message: 'HTTP ${response.statusCode}',
type: AdapterExceptionType.response,
statusCode: response.statusCode,
response: response,
);
}
return response;
}
final response = _convertFromHttpResponse(
await http.Response.fromStream(streamedResponse),
request,
);
if (!response.isSuccess) {
throw AdapterException(
message: 'HTTP ${response.statusCode}',
type: AdapterExceptionType.response,
statusCode: response.statusCode,
response: response,
);
}
return response;
} catch (e, stackTrace) {
if (e is AdapterException) {
rethrow;
}
throw _convertException(e, stackTrace);
} finally {
_unregisterCancelToken(request.cancelToken, completer);
}
}