ezsystems/ezmultiupload-ls
eZ Multi Upload is a legacy eZ Publish extension that adds multi-file upload support to the admin interface, letting editors select and upload several files at once instead of one at a time.
Reality check before anything else: this is not a Laravel package and cannot be used from Laravel. ezsystems/ezmultiupload-ls is an eZ Publish legacy-stack extension — the -ls suffix means it is packaged for ezpublish_legacy/extension/, not for the Symfony/eZ Platform kernel. There is no service provider, no facade, no config/, no migrations, no routes in the Laravel sense. If your application is a Laravel app, stop here and read the last bullet in Gotchas instead.
If you genuinely maintain an eZ Publish 4.x / eZ Platform-with-legacy-bridge install, the setup is:
composer require ezsystems/ezmultiupload-ls
# requires ezsystems/ezpublish-legacy-installer as a Composer plugin,
# which drops the files into ezpublish_legacy/extension/ezmultiupload
Then enable it, regenerate the legacy autoload map, and clear every cache layer:
# settings/override/site.ini.append.php
[ExtensionSettings]
ActiveExtensions[]=ezmultiupload
ActiveAccessExtensions[]=ezmultiupload
php bin/php/ezpgenerateautoloads.php -e
php bin/php/ezcache.php --clear-all
# on eZ Platform also: php bin/console cache:clear
Finally grant the multiupload/upload module function to whatever role your editors use — otherwise the button renders and the AJAX call 403s.
Where to look first, in this order:
extension/ezmultiupload/settings/ezmultiupload.ini.append.php — the only real configuration surface (size limits, mime whitelist, upload target).extension/ezmultiupload/modules/multiupload/upload.php — the actual behaviour; this is the whole feature in one file.extension/ezmultiupload/design/standard/templates/ and settings/override/ — the template overrides that inject the widget into the object edit form.First use case: an editor editing a gallery or a "Files" folder object gets a multi-file picker instead of adding attachments one at a time, then publishes once. That is the entire product.
/multiupload/upload) plus template overrides. If you need to create content programmatically, use eZContentFunctions::createAndPublishObject() (legacy) or ContentService::createContent() (Platform) — not this extension.ezpublish_legacy/extension/ is a Composer-managed vendor path. Any template or JS tweak must live in your own design extension, overriding the extension's templates, or it will vanish on the next composer update.modules/multiupload/upload.php alone and drive it from Dropzone/FilePond/Uppy instead. Capture one working request in the browser network tab, then replay it: it needs the eZ session cookie plus ezjscore's request token, and the response is JSON — inspect upload.php for the exact key names before writing the client.upload.php and confirm with a two-file test on a staging class; do not assume bulk attach when it is actually bulk create.upload_max_filesize / post_max_size (PHP), client_max_body_size (nginx) or Apache LimitRequestBody, the ini setting in ezmultiupload.ini, and the datatype's own constraints. When one batch fails while individual uploads succeed, it is almost always post_max_size — a silent empty $_FILES with no error./api/ezp/v2/content/objects) or shells out to a legacy CLI script. You get retries, progress, tests, and logging for free — none of which this extension offers.NOASSERTION. The upstream is almost certainly GPL-2.0 (eZ legacy lineage) but it is not machine-declared. In any organisation with licence scanning, that is a procurement blocker, not a footnote.type is handled by ezsystems/ezpublish-legacy-installer, which is a Composer plugin. With Composer 2's allow-plugins, an unlisted plugin is skipped without a hard failure — you get a successful require and no files. Add it to config.allow-plugins and re-run.ActiveExtensions, not a missing template.ezpgenerateautoloads.php and you get "class not found" or a blank template with no error.[DebugSettings] DebugOutput=enabled and Debug=inline in site.ini to get stack traces instead of a generic alert; tail var/log/error.log. The legacy kernel's debug.log is per-siteaccess under var/<siteaccess>/.Storage, FormRequest validation, a queued job, and FilePond. Rebuild it; don't port it.How can I help you explore Laravel packages today?