Работа с файлами и медиа в Symfony

Бизюк Андрей

ВГТУ

2024-12-03

Работа с файлами

В Symfony есть несколько способов работы с файлами и медиа. Один из самых популярных способов - это использование бандла (пакета) “VichUploaderBundle”. Этот бандл предоставляет гибкую систему для загрузки файлов и их последующего сохранения в различных хранилищах, таких как локальная файловая система, Amazon S3, Google Cloud Storage и т.д.

Для начала работы с VichUploaderBundle необходимо установить его с помощью композера:

composer require vich/uploader-bundle

Затем необходимо настроить бандл в файле config/packages/vich_uploader.yaml:

vich_uploader:
    db_driver: orm
    mappings:
        product_image:
            uri_prefix: /uploads/products
            upload_destination: %kernel.project_dir%/public/uploads/products
            inject_on_load: true
            delete_on_update: true
            delete_on_remove: true

В этом примере настроек создается маппинг для изображений товаров (product_image). URI-префикс указывает на базовый URL-адрес, по которому будут доступны изображения, а upload_destination указывает на директорию, в которую будут загружаться файлы.

Далее необходимо настроить сущность (entity), для которой будут загружаться файлы. Для этого добавьте аннотации к свойству, которое будет хранить файл:

use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity
 * @Vich\Uploadable
 */
class Product
{
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName")
     */
    private $imageFile;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $imageName;

    // ...
}

В этом примере свойство $imageFile будет содержать загруженный файл, а свойство $imageName - имя файла, под которым он будет сохранен.

Теперь вы можете загружать файлы, используя форму Symfony. Для этого добавьте поле файла в форму:

use Symfony\Component\Form\Extension\Core\Type\FileType;

$builder
    ->add('imageFile', FileType::class, [
        'required' => false,
        'label' => 'Image',
    ])
;

После отправки формы файл будет загружен и сохранен в указанную директорию, а имя файла будет сохранено в базе данных.

Для отображения изображения в шаблоне вы можете использовать хелпер “asset”:

<img src="{{ asset('uploads/products/' ~ product.imageName) }}" alt="Product image">

Если вы хотите работать с другими типами файлов или использовать другие хранилища, вы можете настроить VichUploaderBundle соответствующим образом. Подробнее о настройках и возможностях бандла вы можете прочитать в его документации.