Upload

To upload files there is the UploaderInterface. The UploaderInterface just returns an instance of File that provides a path for the file.

Config

Config Name Example Required Description
provider s3 true The mailing service to be used. Options are: null, sendgrid, mailgun, postmark
naming_strategy random_time true
s3 n/a false The S3 options as defined in the AWS S3 section below.
local n/a false The local options as defined in the local section below.
url https://public.url/ true The base url the file will be located at.

Fetching an Uploader

To get the uploader you can just autowire Parthenon\Common\Upload\UploaderInterface. And that will inject either the uploader called default or if there is only one it’ll inject that.

If you have more than one uploader and neither are called default. Autowiring will result in an exception for no found uploader being flung.

The other way to get the uploader is to call the Parthenon\Common\Upload\UploaderManager::getUploader. This can be injected via autowiring with the interface Parthenon\Common\Upload\UploaderManagerInterface.

use Parthenon\Common\Upload\UploadManager;

class Controller {
    public function uploadAction(Request $request, UploaderManagerInterface $uploaderManager) {
      $uploader = $uploaderManager->getUploader('profile_images');
      // do stuff with uploader
    }
}

Creating your own uploader

namespace Parthenon\Common\Upload;

use Symfony\Component\HttpFoundation\File\UploadedFile;

interface UploaderInterface
{
    public function uploadUploadedFile(UploadedFile $file): File;
}

Naming

Often there is a need for files to be named in a specific way.

namespace Parthenon\Common\Upload;

interface NamingStrategyInterface
{
    public function getName(string $filename): string;
}

Strategies

Name Description
md5_time This creates a md5 hash from the file name and then suffixes a unix timestamp to the end. This does result in a guessable filename.
random_time This this creates a random string that has the timestamp suffixed to it.

Flysystem

Flysystem is an extremely good uploading library that can be used for upload files to multiple systems. There is a wrapper for his library to allow use while also allowing for potential competitors in the future to be usable.

AWS S3

Config Name Example Required Description
key s3 true Your client key to AWS
secret random_time true Your secret for AWS
region fra1 true The name of the region you’re going to upload to
endpoint https://fra1.digitaloceanspaces.com true The url to the AWS APIs.
bucket_name bucket_name true the name of the bucket you’re uploading to.
visibility public false Wether or not you want the file to be publically accessible or not
parthenon:
    common:
        uploader:
            default:
                provider: s3
                naming_strategy: random_time
                url: '%env(resolve:UPLOAD_ACCESS_URL)%'
                s3:
                    key: '%env(resolve:DIGITALOCEAN_SPACES_KEY)%'
                    secret: '%env(resolve:DIGITALOCEAN_SPACES_SECRET)%'
                    region: '%env(resolve:DIGITALOCEAN_SPACES_REGION)%'
                    endpoint: '%env(resolve:DIGITALOCEAN_SPACES_ENDPOINT)%'
                    bucket_name: '%env(resolve:DIGITALOCEAN_SPACES_BUCKET)%'
                    visibility: 'public'

Local

To upload to the local file system.

Config Name Example Required Description
path /tmp true The location on your local filesystem to store the file.
parthenon:
  common:
    uploader:
      default:
        provider: local
        naming_strategy: time_random
        local:
          path: "%kernel.project_dir%/public/uploads"