upload method

  1. @override
Future<ParseResponse> upload({
  1. ProgressCallback? progressCallback,
})
override

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);
  }
}