Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add possibility to specify upload directory when using storage #1377

Open
mysterty opened this issue Mar 30, 2023 · 1 comment
Open

Add possibility to specify upload directory when using storage #1377

mysterty opened this issue Mar 30, 2023 · 1 comment

Comments

@mysterty
Copy link

Feature Request

Q A
New Feature yes
RFC yes
BC Break no

Summary

Actually, using storage like flysystem, you need to make one storage configuration by mapping (+ one "default" for imagine if you use it) :

oneup_flysystem:
  adapters:
    default_adapter:
      local:
        location: "%kernel.project_dir%/public/"
    media_adapter:
      local:
        location: "%kernel.project_dir%/public/uploads/medias/"
    image_adapter:
      local:
        location: "%kernel.project_dir%/public/uploads/images/"
    user_picture_adapter:
      local:
        location: "%kernel.project_dir%/public/uploads/user_pictures/"
  filesystems:
    default_filesystem:
      adapter: default_adapter
      alias: League\Flysystem\Filesystem
      mount: default_filesystem
    media_filesystem:
      adapter: aws_adapter
      alias: League\Flysystem\Filesystem
      mount: media_filesystem
    image_filesystem:
      adapter: images_adapter
      alias: League\Flysystem\Filesystem
      mount: image_filesystem

vich_uploader:
  db_driver: orm
  storage: flysystem

  mappings:
    media:
      uri_prefix: "/uploads/medias"
      upload_destination: oneup_flysystem.media_filesystem_filesystem
    image:
      uri_prefix: "/uploads/images"
      upload_destination: oneup_flysystem.image_filesystem_filesystem
    user_picture:
      uri_prefix: "/uploads/user_pictures"
      upload_destination: oneup_flysystem.user_picture_filesystem_filesystem

liip_imagine:

  loaders:
    flysystem_loader:
      flysystem:
        filesystem_service: oneup_flysystem.default_filesystem_filesystem

  # default loader to use for all filter sets
  data_loader: flysystem_loader

I propose to directly use uri_prefix as directory destination or add an optional directory_destination like :

oneup_flysystem:
  adapters:
    default_adapter:
      local:
        location: "%kernel.project_dir%/public/"
  filesystems:
    default_filesystem:
      adapter: default_adapter
      alias: League\Flysystem\Filesystem
      mount: default_filesystem

vich_uploader:
  db_driver: orm
  storage: flysystem

  mappings:
    media:
      uri_prefix: "/uploads/medias"
      upload_destination: oneup_flysystem.default_filesystem_filesystem
      upload_directory: "/uploads/medias/"
    image:
      uri_prefix: "/uploads/images"
      upload_destination: oneup_flysystem.default_filesystem_filesystem
      upload_directory: "/uploads/images/"
    user_picture:
      uri_prefix: "/uploads/user_pictures"
      upload_destination: oneup_flysystem.default_filesystem_filesystem
      upload_directory: "/uploads/user_pictures/"

liip_imagine:

  loaders:
    flysystem_loader:
      flysystem:
        filesystem_service: oneup_flysystem.default_filesystem_filesystem

  # default loader to use for all filter sets
  data_loader: flysystem_loader
@mysterty
Copy link
Author

Note : this can be accomplished with custom directory namer, and it can also be more friendly used in addition with liip imagine :

vich_uploader:
  db_driver: orm
  storage: flysystem

  mappings:
    media:
      uri_prefix:  "/uploads/.."
      upload_destination: oneup_flysystem.default_filesystem_filesystem ## oneup FlySystem
      namer: Vich\UploaderBundle\Naming\SmartUniqueNamer
      directory_namer:
        service: vich_uploader.namer_directory_property
        options: { property: "directory", transliterate: false }
// Entity\Media.php
class Media
{
	private ?string $basePath = '/uploads/medias/';
	private ?string $directory = null;
	[...]
	// ##################### Custom methods #####################

	public function getDirectory(): ?string
	{
		$date = $this->createdAt?$this->createdAt:date('Y-m-d H:i:s');
		return $this->basePath.$date->format("Y").'/'.$date->format("m").'/';
	}

	public function getUrl(): ?string
	{
		return sprintf('%s/%s', $this->getDirectory(), $this->filename);
	}
	[...]
}

Yet, it could be for some uses...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant