code: async def upload(self, source, destination="", *, write_into=False,
                       block_size=DEFAULT_BLOCK_SIZE):
          
          source = pathlib.Path(source)
          destination = pathlib.PurePosixPath(destination)
          if not write_into:
              destination = destination / source.name
          if await self.path_io.is_file(source):
              await self.make_directory(destination.parent)
              async with self.path_io.open(source, mode="rb") as file_in, \
                      self.upload_stream(destination) as stream:
                  async for block in file_in.iter_by_block(block_size):
                      await stream.write(block)
          elif await self.path_io.is_dir(source):
              await self.make_directory(destination)
              sources = collections.deque([source])
              while sources:
                  src = sources.popleft()
                  async for path in self.path_io.list(src):
                      if write_into:
                          relative = destination.name / path.relative_to(source)
                      else:
                          relative = path.relative_to(source.parent)
                      if await self.path_io.is_dir(path):
                          await self.make_directory(relative)
                          sources.append(path)
                      else:
                          await self.upload(
                              path,
                              relative,
                              write_into=True,
                              block_size=block_size
                          )
docs: :py:func:`asyncio.coroutine`
  
          High level upload method for uploading files and directories
          recursively from file system.
  
          :param source: source path of file or directory on client side
          :type source: :py:class:`str` or :py:class:`pathlib.Path`
  
          :param destination: destination path of file or directory on server
              side
          :type destination: :py:class:`str` or :py:class:`pathlib.PurePosixPath`
  
          :param write_into: write source into destination (if you want upload
              file and change it name, as well with directories)
          :type write_into: :py:class:`bool`
  
          :param block_size: block size for transaction
          :type block_size: :py:class:`int`