upload method

  1. @override
Future<AdapterResponse> upload(
  1. AdapterRequest request, {
  2. ProgressCallback? onProgress,
})
override

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 upload
  • onProgress: 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);
  }
}