uploadFile method
Future<ClientResult>
uploadFile({
- required String url,
- required String filePath,
- required String fileField,
- Map<
String, String> ? fields, - Map<
String, String> ? headers, - Duration? timeout,
- ClientType? clientType,
- OnProgress? onProgress,
- String? cancelKey,
- bool validateStatus(
- int?
- OnSuccess? onSuccess,
- OnError? onError,
- OnHttpError? onHttpError,
- Map<
int, OnStatus> ? onStatus, - Set<
int> ? successCodes, - Set<
int> ? errorCodes,
Uploads a file using multipart/form-data.
Returns a ClientResult tuple. Optionally accepts callbacks for convenient response handling.
Implementation
Future<ClientResult> uploadFile({
required String url,
required String filePath,
required String fileField,
Map<String, String>? fields,
Map<String, String>? headers,
Duration? timeout,
ClientType? clientType,
OnProgress? onProgress,
String? cancelKey,
bool Function(int?)? validateStatus,
// Optional callbacks
OnSuccess? onSuccess,
OnError? onError,
OnHttpError? onHttpError,
Map<int, OnStatus>? onStatus,
Set<int>? successCodes,
Set<int>? errorCodes,
}) async {
final fullUrl = _buildUrl(url);
final useClient = clientType ?? config.clientType;
final stopwatch = Stopwatch()..start();
try {
if (useClient == ClientType.dio) {
dio.CancelToken? cancelToken;
if (cancelKey != null) {
cancelToken = dio.CancelToken();
_cancelTokens[cancelKey] = cancelToken;
}
final formData = dio.FormData.fromMap({
...?fields,
fileField: await dio.MultipartFile.fromFile(filePath),
});
final response = await _dio.post(
fullUrl,
data: formData,
options: dio.Options(
headers: headers,
connectTimeout: config.connectTimeout,
receiveTimeout: config.receiveTimeout,
sendTimeout: timeout ?? config.sendTimeout,
followRedirects: config.followRedirects,
maxRedirects: config.followRedirects ? config.maxRedirects : null,
validateStatus: validateStatus ?? (status) => true,
),
onSendProgress: onProgress,
cancelToken: cancelToken,
);
stopwatch.stop();
if (cancelKey != null) _cancelTokens.remove(cancelKey);
final result = (
_dioToResponse(response, 'POST', stopwatch.elapsedMilliseconds),
null,
);
_handleCallbacks(
response: result.$1,
error: result.$2,
onSuccess: onSuccess,
onError: onError,
onHttpError: onHttpError,
onStatus: onStatus,
successCodes: successCodes,
errorCodes: errorCodes,
);
return result;
} else {
final request = http.MultipartRequest('POST', Uri.parse(fullUrl));
if (headers != null) request.headers.addAll(headers);
if (fields != null) request.fields.addAll(fields);
request.files.add(
await http.MultipartFile.fromPath(fileField, filePath),
);
final streamedResponse = await _withTimeout(
_http.send(request),
timeout ?? config.sendTimeout,
);
final response = await http.Response.fromStream(streamedResponse);
stopwatch.stop();
final result = (
_httpToResponse(response, 'POST', stopwatch.elapsedMilliseconds),
null,
);
_handleCallbacks(
response: result.$1,
error: result.$2,
onSuccess: onSuccess,
onError: onError,
onHttpError: onHttpError,
onStatus: onStatus,
successCodes: successCodes,
errorCodes: errorCodes,
);
return result;
}
} catch (e) {
stopwatch.stop();
if (cancelKey != null) _cancelTokens.remove(cancelKey);
final result = (null, _toException(e, fullUrl));
_handleCallbacks(
response: result.$1,
error: result.$2,
onSuccess: onSuccess,
onError: onError,
onHttpError: onHttpError,
onStatus: onStatus,
successCodes: successCodes,
errorCodes: errorCodes,
);
return result;
}
}