docs: def save(self, file_or_wfs, filename=None, prefix=None, overwrite=None):
          '''
          Saves a `file` or a :class:`~werkzeug.FileStorage` into this storage.
  
          If the upload is not allowed, an :exc:`UploadNotAllowed` error will be raised.
          Otherwise, the file will be saved and its name (including the folder)
          will be returned.
  
          :param file_or_wfs: a file or :class:`werkzeug.FileStorage` file to save.
          :param string filename: The expected filename in the storage.
              Optionnal with a :class:`~werkzeug.FileStorage` but allow to override clietn value
          :param string prefix: a path or a callable returning a path to be prepended to the filename.
          :param bool overwrite: if specified, override the storage default value.
  
          :raise UnauthorizedFileType: If the file type is not allowed
          '''
          if not filename and isinstance(file_or_wfs, FileStorage):
              filename = lower_extension(secure_filename(file_or_wfs.filename))
  
          if not filename:
              raise ValueError('filename is required')
  
          if not self.file_allowed(file_or_wfs, filename):
              raise UnauthorizedFileType()
  
          if prefix:
              filename = '/'.join((prefix() if callable(prefix) else prefix, filename))
  
          if self.upload_to:
              upload_to = self.upload_to() if callable(self.upload_to) else self.upload_to
              filename = '/'.join((upload_to, filename))
  
          overwrite = self.overwrite if overwrite is None else overwrite
          if not overwrite and self.exists(filename):
              raise FileExists(filename)
  
          self.backend.save(file_or_wfs, filename)
  
          return filename