PHPackages                             brezo-it/multi-file-upload - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [File &amp; Storage](/categories/file-storage)
4. /
5. brezo-it/multi-file-upload

ActiveTypo3-cms-extension[File &amp; Storage](/categories/file-storage)

brezo-it/multi-file-upload
==========================

TYPO3 extension: Form Framework enhancement for multi-file upload with FAL support, email attachments and database storage.

v1.0.2(4mo ago)030GPL-2.0-or-laterPHPPHP ^8.2

Since Jan 12Pushed 4mo agoCompare

[ Source](https://github.com/brezo-it/typo3-multi-file-upload)[ Packagist](https://packagist.org/packages/brezo-it/multi-file-upload)[ Docs](https://github.com/brezo-it/typo3-multi-file-upload)[ RSS](/packages/brezo-it-multi-file-upload/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (2)Versions (4)Used By (0)

Multi File Upload
=================

[](#multi-file-upload)

TYPO3 extension for multi-file upload in the Form Framework.

Features
--------

[](#features)

- Multi-image upload form element for TYPO3 Form Framework
- Preview gallery with lightbox support
- Delete functionality for uploaded files
- Email attachment support for multiple files
- Database storage with FAL file references (sys\_file\_reference)
- Bootstrap 5 compatible styling
- German and English localization

Requirements
------------

[](#requirements)

- TYPO3 13.4 LTS
- PHP 8.2+
- EXT:form (TYPO3 Form Framework)

Installation
------------

[](#installation)

```
composer require brezo-it/multi-file-upload
```

Usage
-----

[](#usage)

### Form Editor

[](#form-editor)

1. Open the TYPO3 Form Editor
2. Add a new element "Multi Image Upload" from the "Custom" group
3. Configure allowed MIME types and upload folder as needed

### YAML Configuration

[](#yaml-configuration)

```
renderables:
  - identifier: images
    type: MultiImageUpload
    label: 'Upload Images'
    properties:
      saveToFileMount: '1:/user_upload/'
      allowedMimeTypes:
        - 'image/jpeg'
        - 'image/png'
        - 'image/bmp'
```

### Email Finisher

[](#email-finisher)

Two pre-configured email finishers with attachment support are available in the Form Editor:

- **Multi-file email to receiver** - Send to site administrator
- **Multi-file email to sender** - Send confirmation to form submitter

For YAML configuration, use the pre-configured finisher identifiers:

```
finishers:
  - identifier: MultiFileEmailToReceiver
    options:
      subject: 'New submission'
      recipients:
        admin@example.com: 'Admin'
      senderAddress: 'noreply@example.com'
```

Or override an existing email finisher with the custom implementation class:

```
finishers:
  - identifier: EmailToReceiver
    options:
      implementationClassName: BrezoIt\MultiFileUpload\Form\Finishers\MultiFileEmailFinisher
      subject: 'New submission'
      recipients:
        admin@example.com: 'Admin'
      senderAddress: 'noreply@example.com'
      attachUploads: true
```

### Database Finisher (with FAL support)

[](#database-finisher-with-fal-support)

The standard TYPO3 `SaveToDatabase` finisher only stores file UIDs, not proper FAL references. This extension provides `AttachFilesToRecord` which creates `sys_file_reference` records, making uploaded images visible in the TYPO3 backend.

**How it works:**

1. Use the core `SaveToDatabase` finisher to create the record (without file fields)
2. Use `AttachFilesToRecord` to attach files via `sys_file_reference` records
3. The finisher reads the record UID from `{SaveToDatabase.insertedUids.0}`
4. Images are immediately visible and editable in the TYPO3 backend

**Example: Classified Ads / Marketplace Form**

```
type: Form
identifier: classified-ad
label: 'Post a Classified Ad'
prototypeName: standard

renderables:
  - type: Page
    identifier: page-1
    label: 'Your Ad'
    renderables:
      - type: Text
        identifier: title
        label: 'Ad Title'
        validators:
          - identifier: NotEmpty
      - type: Textarea
        identifier: description
        label: 'Description'
      - type: MultiImageUpload
        identifier: images
        label: 'Photos (max. 5)'
        properties:
          saveToFileMount: '1:/user_upload/'
          allowedMimeTypes:
            - 'image/jpeg'
            - 'image/png'

finishers:
  # 1. Core finisher creates the record
  - identifier: SaveToDatabase
    options:
      table: 'tx_myext_domain_model_classifiedad'
      databaseColumnMappings:
        pid:
          value: 1
        hidden:
          value: 1
      elements:
        title:
          mapOnDatabaseColumn: title
        description:
          mapOnDatabaseColumn: description
        # Note: Do NOT include file fields here!

  # 2. AttachFilesToRecord creates sys_file_reference entries
  - identifier: AttachFilesToRecord
    options:
      table: 'tx_myext_domain_model_classifiedad'
      recordUid: '{SaveToDatabase.insertedUids.0}'
      storagePid: 1
      elements:
        images:
          mapOnDatabaseColumn: images

  - identifier: MultiFileEmailToReceiver
    options:
      subject: 'New classified ad submitted'
      recipients:
        admin@example.com: 'Admin'
      senderAddress: 'noreply@example.com'
  - identifier: Confirmation
    options:
      message: 'Thank you! Your ad will be reviewed and published soon.'
```

**AttachFilesToRecord Options:**

OptionTypeDescription`table`stringTarget database table`recordUid`stringUID of the record (use `{SaveToDatabase.insertedUids.0}`)`storagePid`intPage ID for sys\_file\_reference records`elements`arrayMapping of form elements to database columns**TCA configuration for the images field:**

```
'images' => [
    'label' => 'Images',
    'config' => [
        'type' => 'file',
        'allowed' => 'jpg,jpeg,png',
        'maxitems' => 5,
    ],
],
```

Configuration Options
---------------------

[](#configuration-options)

### Form Element Properties

[](#form-element-properties)

PropertyTypeDefaultDescription`saveToFileMount`string`1:/user_upload/`FAL storage path for uploads`allowedMimeTypes`array`image/jpeg, image/png, image/bmp`Allowed file types`imageMaxWidth`int`400`Max width for preview images`imageMaxHeight`int`400`Max height for preview images`imageLinkMaxWidth`int`1200`Max width for lightbox images### Rendering Options (CSS Classes)

[](#rendering-options-css-classes)

OptionDefaultDescription`previewListClass``row g-3`Container class for image grid`previewItemClass``col-md-4 col-lg-3 mb-3`Class for each image item`previewImageWrapperClass``card`Wrapper class for image card`deleteWrapperClass``form-check card-footer`Class for delete checkbox wrapperFile Structure
--------------

[](#file-structure)

```
Classes/
  Domain/Model/
    MultiFile.php                              # ObjectStorage wrapper for multi-files
  Form/
    Elements/MultiImageUpload.php              # Form element definition
    Finishers/
      AttachFilesToRecordFinisher.php          # Attach files to database record
      MultiFileEmailFinisher.php               # Email finisher with attachments
  Mvc/Property/
    MultiFilePropertyMappingConfiguration.php  # Property mapping config (hooks)
    TypeConverter/
      MultiUploadedFileReferenceConverter.php  # File upload converter
  ViewHelpers/Form/
    MultiUploadedResourceViewHelper.php        # File input rendering
    MultiUploadDeleteCheckboxViewHelper.php    # Delete checkbox

Configuration/
  Icons.php                 # Icon registration
  JavaScriptModules.php     # Form editor JS
  Services.yaml             # DI configuration
  Yaml/
    FormSetup.yaml          # Form framework setup
    FormElements/           # Form element YAML configs
    Finishers/              # Finisher YAML configs

Resources/
  Private/
    Language/               # Translations (en, de)
    Partials/Form/          # Fluid templates
    Templates/Finishers/    # Email templates
  Public/
    Css/multi-upload.css    # Styles
    Icons/Extension.svg     # Extension icon
    JavaScript/             # Form editor JS

```

Customization
-------------

[](#customization)

### Custom Styling

[](#custom-styling)

The extension's CSS is automatically loaded via `` when the form element is rendered.

To override styles, add your own CSS with higher specificity or use the Asset ViewHelper in your template:

```

```

Or include it globally via TypoScript (loaded on all pages):

```
page.includeCSS {
    multiUploadCustom = EXT:your_extension/Resources/Public/Css/multi-upload-custom.css
}

```

### Custom Templates

[](#custom-templates)

Override templates via TypoScript:

```
plugin.tx_form.settings.yamlConfigurations {
    100 = EXT:your_extension/Configuration/Yaml/CustomFormSetup.yaml
}

```

Author
------

[](#author)

Maik Preuss

License
-------

[](#license)

GPL-2.0-or-later

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance77

Regular maintenance activity

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

3

Last Release

127d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/ffd3b0b848e158612abb9b9c41dab347b1db648613b6ef3f1fea41e8c2f6575e?d=identicon)[maikp](/maintainers/maikp)

---

Top Contributors

[![maikp](https://avatars.githubusercontent.com/u/1253027?v=4)](https://github.com/maikp "maikp (3 commits)")

---

Tags

uploadextensionformtypo3file-uploadfalmulti-file

### Embed Badge

![Health badge](/badges/brezo-it-multi-file-upload/health.svg)

```
[![Health](https://phpackages.com/badges/brezo-it-multi-file-upload/health.svg)](https://phpackages.com/packages/brezo-it-multi-file-upload)
```

###  Alternatives

[kartik-v/yii2-widget-fileinput

An enhanced FileInput widget for Bootstrap 3.x, 4.x &amp; 5.x with file preview, multiple selection, and more features (sub repo split from yii2-widgets)

2286.8M95](/packages/kartik-v-yii2-widget-fileinput)[ichhabrecht/filefill

Find and fetch missing local files from different remotes

671.4M1](/packages/ichhabrecht-filefill)[causal/image_autoresize

Simplify the way your editors may upload their images: no complex local procedure needed, let TYPO3 automatically resize down their huge images/pictures on-the-fly during upload (or using a command for batch processing) and according to your own business rules (directory/groups). This will highly reduce the footprint on your server and speed-up response time if lots of images are rendered (e.g., in a gallery). Features an EXIF/IPTC extractor to ensure metadata may be used by the FAL indexer even if not preserved upon resizing.

19455.6k](/packages/causal-image-autoresize)[beechit/fal-securedownload

Secure download of assets. Makes it possible to secure FE use of assets/files by setting permissions to folders/files for fe\_groups.

37569.0k3](/packages/beechit-fal-securedownload)[pagemachine/typo3-formlog

Form log for TYPO3

23225.3k6](/packages/pagemachine-typo3-formlog)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
