upload method
Uploads a file to Parse Server
Implementation
@override
Future<ParseResponse> upload({ProgressCallback? progressCallback}) async {
if (saved) {
//Creates a Fake Response to return the correct result
final Map<String, String> response = <String, String>{
'url': url!,
'name': name,
};
return handleResponse<ParseXFile>(
this,
ParseNetworkResponse(data: json.encode(response), statusCode: 201),
ParseApiRQ.upload,
_debug,
parseClassName,
);
}
progressCallback ??= _progressCallback;
_cancelToken = CancelToken();
Map<String, String> headers = <String, String>{};
// Set content-type from XFile.mimeType or detect using lookupMimeType
// If neither provides a type, let the server infer from the filename
String? contentType;
if (parseIsWeb) {
contentType = file?.mimeType ??
lookupMimeType(
url ?? file?.name ?? name,
headerBytes: await file?.readAsBytes(),
);
} else {
contentType = file?.mimeType ?? lookupMimeType(file!.path);
}
if (contentType != null) {
headers[HttpHeaders.contentTypeHeader] = contentType;
}
if (!parseIsWeb) {
headers[HttpHeaders.contentLengthHeader] = '${await file!.length()}';
}
try {
final String uri = ParseCoreData().serverUrl + _path;
Stream<List<int>>? data;
if (parseIsWeb) {
data = Stream<List<int>>.fromIterable(<List<int>>[
await file!.readAsBytes(),
]);
} else {
data = file!.openRead();
}
final ParseNetworkResponse response = await _client.postBytes(
uri,
options: ParseNetworkOptions(headers: headers),
data: data,
onSendProgress: progressCallback,
cancelToken: _cancelToken,
);
if (response.statusCode == 201) {
final Map<String, dynamic> map = json.decode(response.data);
url = map['url'].toString();
name = map['name'].toString();
}
return handleResponse<ParseXFile>(
this,
response,
ParseApiRQ.upload,
_debug,
parseClassName,
);
} on Exception catch (e) {
return handleException(e, ParseApiRQ.upload, _debug, parseClassName);
}
}