public function upload()
    {
        $this->verifyFile();

        $model = $this->makeModel();

        $model->size = $this->source->size();
        $model->mime_type = $this->source->mimeType();
        $model->extension = $this->source->extension();

        $model->aggregate_type = $this->inferAggregateType($model->mime_type, $model->extension);

        $model->disk = $this->disk ?: $this->config['default_disk'];
        $model->directory = $this->directory;
        $model->filename = $this->generateFilename();

        $model = $this->handleDuplicate($model);

        if (is_callable($this->before_save)) {
            call_user_func($this->before_save, $model, $this->source);
        }

        $this->filesystem->disk($model->disk)->put($model->getDiskPath(), $this->source->contents());
        $model->save();

        return $model;
    }