uploadFileStream method

Future<bool> uploadFileStream(
  1. FtpFile file,
  2. Stream<List<int>> data,
  3. int fileSize, {
  4. bool append = false,
  5. OnTransferProgress? onUploadProgress,
})

Implementation

Future<bool> uploadFileStream(
  FtpFile file,
  Stream<List<int>> data,
  int fileSize, {
  bool append = false,
  OnTransferProgress? onUploadProgress,
}) =>
    _socket.openTransferChannel((socketFuture, log) async {
      (append ? FtpCommand.APPE : FtpCommand.STOR).write(
        _socket,
        [file.path],
      );
      final socket = await socketFuture;
      final response = await _socket.read();

      // wait 125 || 150 and >200 that indicates the end of the transfer
      final bool transferCompleted = response.isSuccessfulForDataTransfer;
      if (!transferCompleted) {
        throw FtpException('Error while uploading file');
      }
      var uploaded = 0;
      final transform = data.transform<Uint8List>(
        StreamTransformer.fromHandlers(
          handleData: (event, sink) {
            sink.add(Uint8List.fromList(event));
            uploaded += event.length;
            final total = max(fileSize, uploaded);
            onUploadProgress?.call(uploaded, total, uploaded / total * 100);
            log?.call('Uploaded $uploaded of $total bytes');
          },
        ),
      );
      await socket.addSteam(transform);
      await socket.flush;
      await socket.close(ClientSocketDirection.readWrite);
      final response2 = await _socket.read();
      return response2.isSuccessful;
    });