Terug naar hoofdinhoud
Media in Joomla
Op deze pagina
# Topics

Media in Joomla

08 juni 2026

De meeste Joomla-componenten slaan gegevens op als records in een databasetabel: artikelen, contactpersonen, banners en nieuwsfeeds. De Media Manager (com_media) werkt anders. Deze beheert geen records, maar bestanden op een opslagmedium: afbeeldingen, pdf's, audio- en videobestanden die door de rest van de website worden gebruikt.

Je komt de Media Manager tegen telkens wanneer je een afbeelding toevoegt aan een artikel, een logo kiest voor een banner of een brochure koppelt aan een contactpersoon. Het is het hulpmiddel dat vrijwel alle andere componenten gebruiken wanneer ze een bestand nodig hebben. Begrijp je de Media Manager, dan begrijp je de volledige bestandslaag van Joomla.

Joomla's ingebouwde beheerder voor afbeeldingen, documenten, audio en video

Dit artikel legt uit hoe de Media Manager werkelijk werkt. Het behandelt de basis voor website-eigenaren, het dagelijkse gebruik voor redacteuren en beheerders en de technische architectuur voor ontwikkelaars. Je leert hoe uploads worden gecontroleerd, waarom een .docx-bestand standaard wordt geblokkeerd, waarom mappen geen categorieën zijn en hoe het uitbreidbare opslagmodel ervoor zorgt dat Joomla bestanden naar een cloudopslag kan schrijven zonder de interface te wijzigen.

1. De basis

1.1 Wat maakt media anders?

Het eerste dat je moet begrijpen, is dat de Media Manager zich fundamenteel anders gedraagt dan de meeste andere componenten in Joomla:

De meeste componentenMedia Manager
Slaan records op in een databasetabel Slaat bestanden op in een bestandssysteem
Organiseren inhoud met categorieën Organiseert bestanden met mappen (echte directories)
Worden weergegeven via menu-items Heeft geen menu-item in de front-end, het is een hulpmiddel
Gebruiken één vaste opslaglocatie Gebruikt uitbreidbare adapters (lokale schijf, cloud, ...)

De belangrijkste consequentie hiervan is dat er geen #__media-tabel bestaat. Je mediagegevens zijn simpelweg de mappenstructuur op schijf. Dat ene feit verklaart vrijwel alles in dit artikel, van back-ups en prestaties tot migraties.

1.2 De onderdelen

Het helpt om de volledige keten in één overzicht te zien, van de interface tot de daadwerkelijke bestanden:

Media Manager-interface (Vue single-page app)
   │  communiceert via REST / AJAX
   ▼
ApiModel  →  ProviderManager  →  Adapter  →  opslag
                                    (lokaal)      (bestanden op schijf)
  • De interface is een Vue-gebaseerde single-page applicatie in de backend.
  • Een adapter weet hoe bestanden gelezen en geschreven moeten worden op één opslagplatform.
  • Een provider is een bestandssysteemplugin die één of meerdere adapters levert.
  • De opslag is de plek waar de bytes daadwerkelijk staan. Standaard is dat de map images/ op de lokale schijf.

Houd dit schema in gedachten. In het technische deel van dit artikel komt elk onderdeel terug als een uitbreidingspunt.

1.3 Waar vind je de Media Manager?

In Joomla 6 vind je de Media Manager en de instellingen op twee plaatsen:

Content → Media                              (de Media Manager zelf)
System  → Global Configuration → Media       (de instellingen)

De Media Manager verschijnt ook ingebed in formulieren die een mediaveld gebruiken. De knop "Selecteren" naast een afbeeldingsveld opent dezelfde Media Manager in een modaal venster. Veel redacteuren openen daarom nooit rechtstreeks Content → Media, maar gebruiken hem via een afbeeldingsknop in de editor.

1.4 Twee hoofdlocaties: /images en /files

Jarenlang gebruikte Joomla alleen de map images/. Moderne Joomla-versies bieden standaard twee hoofdlocaties, zodat documenten niet tussen afbeeldingen terechtkomen:

HoofdlocatieStandaardmapBedoeld voor
images images/ Afbeeldingen die in content worden gebruikt, standaard voor afbeeldingskiezers
files files/ Documenten en downloads zoals pdf's, Office-bestanden en archieven

De scheiding is puur organisatorisch: plaats afbeeldingen in /images en downloadbare documenten in /files. Beide mappen bevinden zich in de hoofdmap van Joomla.

1.5 Twee configuratielagen bepalen deze hoofdlocaties

Dit detail zorgt vaak voor verwarring omdat de hoofdlocaties op twee verschillende plaatsen worden geconfigureerd, elk met een eigen doel:

1. Lokale bestandssysteemplugin (plg_filesystem_local)
   parameter "directories" = [{"directory":"images"}, {"directory":"files"}]
   → elke invoer wordt een APARTE adapter (een hoofdniveau in de boomstructuur)
   → elke adapter kan eigen thumbnailinstellingen hebben
   → voeg hier extra mappen toe, bijvoorbeeld "downloads"

2. com_media-instellingen (System → Global Configuration → Media)
   image_path = images   ← standaardlocatie voor afbeeldingsvelden
   file_path  = files    ← standaardlocatie voor documenten

Kort samengevat: de plugin bepaalt welke mappen zichtbaar worden als adapters; de componentinstellingen bepalen welke daarvan als "afbeeldingen" of "bestanden" worden gebruikt in mediakiezers. Beide worden gecontroleerd op geldigheid. Systeemmappen zoals administrator, libraries en cache zijn expliciet uitgesloten en kunnen niet als hoofdlocatie worden ingesteld.

Naar boven

2. Werken met de Media Manager

2.1 De belangrijkste acties

Via de werkbalk en de contextmenu's met de rechtermuisknop beschik je over de functies die je van een bestandsbeheerder mag verwachten:

ActieWat het doet
Uploaden Bestanden slepen en neerzetten of selecteren via een dialoogvenster, meerdere tegelijk mogelijk.
Nieuwe map maken Maakt een echte submap op schijf aan.
Hernoemen Wijzigt de naam van een bestand of map.
Kopiëren / verplaatsen Binnen een map, tussen mappen of zelfs tussen verschillende adapters.
Verwijderen Verwijdert een bestand of map.
Bewerken Opent de ingebouwde afbeeldingseditor (alleen voor afbeeldingen).
Voorbeeld Toont een voorbeeld van afbeeldingen, video's, audio en pdf-bestanden.

2.2 Twee weergaven, één beheerder

De Media Manager biedt twee manieren om dezelfde map te bekijken:

  • Rasterweergave, met miniaturen, ideaal voor afbeeldingen.
  • Lijstweergave, met naam, bestandsgrootte, afmetingen en datum, ideaal voor documenten.

Een broodkruimelpad toont de huidige locatie. Aan de linkerkant staat een boomstructuur waarmee je snel kunt wisselen tussen mappen en tussen verschillende adapters (bijvoorbeeld tussen de hoofdlocaties voor afbeeldingen en documenten).

2.3 Uploaden, wat gebeurt er werkelijk?

Een upload is meer dan simpelweg een bestand kopiëren. Elk bestand doorloopt eerst een reeks controles voordat het wordt opgeslagen:

Browser → bestand slepen → ApiModel::createFile()
   → controleer of de extensie is toegestaan
   → controleer het echte MIME-type (indien ingeschakeld)
   → controleer of de grootte binnen upload_maxsize valt
   → Adapter schrijft de bytes naar de opslaglocatie

Als één van deze controles mislukt, wordt het bestand afgewezen voordat het wordt opgeslagen. In het deel over beveiliging bekijken we waarom deze controles zo belangrijk zijn.

2.4 De ingebouwde afbeeldingseditor

Selecteer een afbeelding en klik op Bewerken. Er wordt dan een aparte Vue-applicatie geopend met drie standaardgereedschappen:

GereedschapPlugin (groep media-action)
Bijsnijden plg_media-action_crop
Formaat wijzigen plg_media-action_resize
Roteren plg_media-action_rotate

Opvallend is dat elk gereedschap een plugin is en niet hardcoded in de editor zit. Daardoor is de editor uitbreidbaar. Maak je zelf een plugin in de groep media-action, dan verschijnt jouw gereedschap automatisch in de werkbalk. Bij het opslaan wordt het resultaat via dezelfde adapter als nieuw bestand opgeslagen of wordt het bestaande bestand overschreven.

2.5 Media kiezen vanuit andere componenten

Dit is eigenlijk de belangrijkste functie van de Media Manager. Het formulierveld Media (type="media") toont een kleine voorbeeldweergave met een knop "Selecteren":

<field name="image" type="media"
       label="Afbeelding" directory="banners" />
  • Wordt gebruikt door artikelen, contactpersonen, categorieën, modules, aangepaste velden, templates en meer.
  • De knop "Selecteren" opent de Media Manager in een modaal venster, beperkt tot de opgegeven directory.
  • Na selectie wordt een pad opgeslagen, bijvoorbeeld images/banners/logo.png.

De Media Manager is daarmee de gedeelde bestandskiezer van het hele CMS. Andere componenten slaan alleen het pad op; het bestand zelf blijft op schijf staan.

2.6 De afbeeldingsknop in de editor (waar de meeste mensen hem tegenkomen)

Ontwikkelaars gebruiken meestal het mediaveld. Redacteuren komen de Media Manager vooral tegen via de werkbalk van hun editor. In TinyMCE verloopt dat ongeveer zo:

Artikel bewerken → klik op de knop Afbeelding
   → de Media Manager opent in een modaal venster
   → bladeren of uploaden → bestand kiezen → Invoegen
   → TinyMCE plaatst vervolgens HTML in de inhoud:
<img src="/images/articles/example.jpg" alt="Voorbeeld" loading="lazy">
  • Standaard wordt de hoofdlocatie voor afbeeldingen (image_path) geopend.
  • Vul altijd een goede alt-tekst in voor toegankelijkheid en SEO.
  • Bestanden kunnen direct vanuit het venster worden geüpload, waardoor veel redacteuren nooit rechtstreeks naar Content → Media gaan.

Voor de meeste contentredacteuren is de Media Manager simpelweg die afbeeldingsknop. Alles wat hierboven is beschreven gebeurt achter de schermen van dat ene venster.

2.7 Bestanden koppelen en insluiten in content

Bij afbeeldingen wordt automatisch een <img>-element ingevoegd. Andere bestandstypen voeg je meestal handmatig toe als link of via een knop in de editor. Het pad verwijst altijd naar een locatie binnen een van de Media Manager-hoofdlocaties:

<!-- Documentdownload (PDF / Office) -->
<a href="/files/documents/brochure.pdf">Download de brochure (PDF)</a>
<a href="/files/documents/prijslijst.xlsx">Prijslijst (XLSX)</a>

<!-- Audio: een MP3 uit /files of /images -->
<audio controls src="/files/audio/interview.mp3"></audio>

<!-- Video: een lokale MP4 -->
<video controls width="800" src="/files/video/demo.mp4"></video>
TypeGebruik in content
Afbeelding Afbeeldingsknop in de editor → <img> (inline)
PDF / Office-bestand <a href>-downloadlink (browser opent of downloadt het bestand)
MP3 <audio controls>-element
MP4 <video controls>-element

Een praktische waarschuwing voor grote video's: serveer omvangrijke MP4-bestanden niet vanaf je Joomla-server. Gebruik liever YouTube, Vimeo of een CDN en sluit de speler in. Een lokaal <video>-element is prima voor een korte clip, maar wordt zwaar voor langere video's omdat alle bandbreedte van je eigen server komt en er geen adaptieve streaming beschikbaar is.

Naar boven

3. Bestandstypen: afbeeldingen, Office, audio, video en SVG

3.1 De vier extensielijsten

Naast de hoofdwhitelist voor uploads verdeelt het scherm Opties bestandsextensies in vier groepen. Deze groepen bepalen hoe de Media Manager een bestand verwerkt en weergeeft nadat het is geüpload:

OptieStandaardwaardeFunctie
Toegestaan (restrict_uploads_extensions) bmp,gif,jpg,jpeg,png,webp,avif,ico,mp3,mp4,
 odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv
De whitelist, alles buiten deze lijst wordt geweigerd
Afbeelding (image_extensions) bmp,gif,jpg,jpeg,png,webp,avif Wordt weergegeven als miniatuur en kan in de afbeeldingseditor worden geopend
Audio (audio_extensions) mp3,m4a,mp4a,ogg Krijgt een ingebouwde <audio>-speler
Video (video_extensions) mp4,mp4v,mpeg,mov,webm Krijgt een ingebouwde <video>-speler
Document (doc_extensions) doc,odg,odp,ods,odt,pdf,ppt,txt,xcf,xls,csv Wordt weergegeven met een documentpictogram; pdf's kunnen inline worden bekeken

De belangrijkste regel: een extensie moet in de lijst Toegestaan staan om überhaupt geüpload te kunnen worden. De andere lijsten bepalen alleen hoe het bestand daarna wordt weergegeven.

3.2 Audio en video: MP3 en MP4 werken direct

Goed nieuws: mp3 en mp4 staan standaard zowel in de whitelist als in de audio- en videolijsten. Ze werken dus direct na installatie:

upload interview.mp3  → toegestaan → audio_extensions → ingebouwde <audio>-speler
upload promo.mp4      → toegestaan → video_extensions → ingebouwde <video>-speler
  • Plaats ze in /files of /images, selecteer ze via een mediaveld en ze worden automatisch weergegeven in de preview.
  • mp4 staat zowel in de audio- als videolijst; Joomla kiest automatisch de juiste speler.
  • Wil je webm, mov of ogg gebruiken? Deze staan al in de audio- of videolijsten, maar moeten mogelijk nog worden toegevoegd aan de lijst Toegestaan voordat uploads werken.

3.3 Microsoft Office en OpenDocument: een veelvoorkomende valkuil

Let goed op de standaardinstellingen, want dit veroorzaakt regelmatig supportvragen:

FormaatExtensiesStandaard toegestaan?
OpenDocument odt, ods, odp, odg Ja
Oud Office-formaat doc, xls, ppt Ja
Modern Office-formaat (OOXML) docx, xlsx, pptx Nee

Standaard kun je dus een oude .doc uploaden, maar geen moderne .docx. De moderne Office-formaten ontbreken zowel in de extensiewhitelist als in de MIME-whitelist.

Om moderne Office-documenten toe te staan, moet je zowel de extensies als de MIME-types toevoegen:

restrict_uploads_extensions:  …,docx,xlsx,pptx

upload_mime: voeg de OOXML MIME-types toe, bijvoorbeeld

application/vnd.openxmlformats-officedocument.wordprocessingml.document     (docx)
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet           (xlsx)
application/vnd.openxmlformats-officedocument.presentationml.presentation   (pptx)

Voeg je alleen de extensie toe maar niet het MIME-type, dan zal de controle Check MIME de upload alsnog blokkeren. Dit is de klassieke "mijn docx wil niet uploaden"-melding.

3.4 SVG: bewust geblokkeerd

De extensie svg staat standaard niet in één van de lijsten. Niet bij Toegestaan, niet bij Afbeeldingen en ook image/svg+xml ontbreekt in de MIME-whitelist. Dat is een bewuste beveiligingskeuze:

Een .svg-bestand is XML. XML kan bevatten:

   <script>…</script>             → opgeslagen XSS
   <a xlink:href="javascript:">   → uitvoering van scripts
   externe entity-referenties     → SSRF / datalekken

Een SVG gedraagt zich als een afbeelding, maar kan zich ook gedragen als een document met uitvoerbare code. Daardoor vormt een SVG-bestand een mogelijk risico voor opgeslagen cross-site scripting (XSS). Joomla blokkeert SVG daarom standaard.

Heb je SVG echt nodig, bijvoorbeeld voor een vertrouwde iconenset, schakel het dan zorgvuldig in:

1. Voeg svg toe aan restrict_uploads_extensions EN image_extensions
2. Voeg image/svg+xml toe aan upload_mime
3. Geef alleen vertrouwde gebruikers uploadrechten (ACL)
4. Reinig SVG-bestanden vooraf
   (verwijder scripts, event-handlers en externe verwijzingen)

Zie het inschakelen van SVG op dezelfde manier als het toestaan van eigen HTML-code: meer flexibiliteit, maar ook meer verantwoordelijkheid. Beperk dit tot vertrouwde gebruikers en controleer de bestanden.

3.5 Een nieuw bestandstype toevoegen: de checklist

Wanneer een upload wordt geweigerd, controleer dan deze punten in volgorde:

1. Staat de extensie in restrict_uploads_extensions?
   (zo niet, dan wordt het bestand direct geblokkeerd)

2. Staat Check MIME aan?
   → het echte MIME-type moet voorkomen in upload_mime

3. Wil je miniaturen of de afbeeldingseditor gebruiken?
   → voeg de extensie toe aan image_extensions

4. Wil je een audio- of videospeler?
   → voeg de extensie toe aan audio_extensions of video_extensions

5. Is het bestand kleiner dan upload_maxsize én PHP's
   upload_max_filesize en post_max_size?

Zowel de extensie als het MIME-type moeten worden goedgekeurd. Slechts één van beide aanpassen is de meest voorkomende reden waarom een bestand nog steeds niet geüpload kan worden.

Naar boven

4. Mappen, geen categorieën

4.1 De mappenstructuur is het bestandssysteem

Er bestaat hier geen categorieboom met nested sets. In de Media Manager betekent "organiseren" simpelweg werken met echte mappen:

images/
├── banners/
├── headshots/
│   └── 2026/
└── sampledata/
  • Mappen worden aangemaakt, hernoemd en verwijderd als echte directories op de opslaglocatie.
  • Rechten worden bepaald door zowel bestandssysteemrechten als Joomla ACL, niet door categorie-ACL's.

Waar andere componenten vragen "in welke categorie?", vraagt de Media Manager: "in welke map, op welke adapter?".

4.2 Waarom dit belangrijk is

Omdat de boomstructuur daadwerkelijk de schijf weerspiegelt, gelden bekende databaseconcepten van categorieën hier niet:

  • Er is geen knop Rebuild en er zijn geen lft- of rgt-waarden. Een bestand verplaatsen betekent letterlijk een rename() op schijf.
  • Een verplaatsing tussen adapters bestaat uit kopiëren en daarna verwijderen, omdat beide opslaglocaties onafhankelijk van elkaar zijn.
  • Diepe mapstructuren zijn snel om doorheen te bladeren, maar kunnen zoekacties vertragen omdat meer mappen moeten worden gescand.

4.3 Een logische mapstructuur

Omdat de boomstructuur uit echte directories bestaat, levert een nette indeling voordelen op voor back-ups, migraties en mediakiezers. Een veelgebruikte structuur ziet er bijvoorbeeld zo uit:

images/                  files/
├── articles/            ├── documents/   ← PDF's, Office-bestanden
├── banners/             ├── audio/       ← MP3
├── products/            └── video/       ← korte MP4-bestanden
├── logos/
└── headshots/2026/

Enkele richtlijnen:

  • Plaats afbeeldingen in /images en documenten of downloads in /files.
  • Gebruik één map per context, bijvoorbeeld artikelen, producten of banners. Dat houdt mediakiezers overzichtelijk.
  • Gebruik submappen per jaar of campagne, zoals 2026/, zodat één map nooit duizenden bestanden bevat. Dat houdt zowel de interface als zoekopdrachten snel.
  • Spreek de structuur af voordat redacteuren bestanden gaan uploaden. Achteraf reorganiseren betekent dat bestaande paden in artikelen en modules moeten worden aangepast.

Mapnamen worden onderdeel van URL's en inhoudspaden. Behandel ze daarom als een stukje informatiearchitectuur en niet als een verzamelbak.

Naar boven

5. De adapterarchitectuur (het slimme deel)

5.1 Eén interface, verwisselbare opslag

De volledige component is gebouwd rond één contract: AdapterInterface. Dit definieert twaalf methoden:

getFile       getFiles      getResource
createFolder  createFile    updateFile
copy          move          delete
getUrl        search        getAdapterName

Implementeer deze twaalf methoden en de volledige Media Manager werkt direct met jouw opslagplatform, of dat nu Amazon S3, Azure Blob Storage, een DAM-systeem of iets anders is.

5.2 Providers leveren adapters

Een adapter verschijnt niet vanzelf. Een provider levert één of meer adapters aan:

Bestandssysteemplugin (provider)  →  één of meer adapters
plg_filesystem_local              →  LocalAdapter (één per geconfigureerde hoofdlocatie)
  • Een bestandssysteemprovider is een plugin uit de groep filesystem.
  • De Joomla-core levert standaard slechts één provider: Local (plugins/filesystem/local).
  • De configuratie van deze plugin bevat de hoofdlocaties, bijvoorbeeld images en files. Elke hoofdlocatie wordt een afzonderlijke adapter in de boomstructuur.

5.3 De ProviderManager

Een kleine registry bindt alles aan elkaar:

ProviderManager
  ├─ registreert alle ingeschakelde filesystem-plugins
  ├─ elke plugin levert zijn adapter(s)
  └─ de interface toont deze als provider-adapter-nodes

Een adapter wordt aangesproken via het formaat provider:adapter:/pad, bijvoorbeeld:

local-images:/headshots/peter.png
local-files:/contracten/2026.pdf

Dankzij het voorvoegsel provider-adapter weten zowel de API als de gebruikersinterface op welke opslaglocatie een bestand zich bevindt.

5.4 Een cloudadapter schrijven (conceptueel)

Om te laten zien hoe uitbreidbaar dit systeem is, volgt hier een vereenvoudigd voorbeeld van een S3-adapter:

class S3Adapter implements AdapterInterface
{
    public function getFiles(string $path = '/'): array { /* bucket uitlezen */ }

    public function createFile(string $name, string $path, $data): string
    {
        /* putObject */
    }

    public function getUrl(string $path): string
    {
        /* gesigneerde URL */
    }

    // ... de overige negen methoden
}

Verpak deze adapter in een plugin uit de groep filesystem, activeer de plugin en er verschijnt automatisch een nieuwe hoofdlocatie in de Media Manager. De gebruikersinterface hoeft hiervoor niet aangepast te worden.

Dit is misschien wel het belangrijkste architecturale principe van com_media: opslag is een plugin.

Naar boven

6. Beveiliging: de Media Manager is een mogelijk aanvalspunt

6.1 Waarom dit gevoelig is

Een bestandsbeheerder geeft gebruikers de mogelijkheid bestanden naar de webserver te schrijven. Dat maakt uploads aantrekkelijk voor aanvallers. Joomla beschermt zich daarom met meerdere beveiligingslagen die je bij voorkeur ingeschakeld laat.

6.2 Het uploadcontroletraject

Elke upload wordt in deze volgorde gecontroleerd:

ControleOptieEffect
Restrict Uploads restrict_uploads Hoofdschakelaar, alleen toegestane bestandstypen mogen worden geüpload
Allowed Extensions restrict_uploads_extensions De whitelist met toegestane extensies (bmp,gif,jpg,png,webp,avif,pdf,mp4…)
Check MIME Type check_mime Controleert het werkelijke bestandstype, niet alleen de extensie
Legal MIME Types upload_mime Whitelist met toegestane MIME-types
Ignored Extensions ignore_extensions Slaat de MIME-controle over voor deze extensies
Max Size upload_maxsize Weigert bestanden groter dan het ingestelde maximum (standaard 10 MB)

6.3 Een extensie is geen inhoud

Dit vormt de kern van uploadbeveiliging. Een bestand met de naam logo.png kan in werkelijkheid PHP-code bevatten. Daarom is Check MIME Type zo belangrijk:

restrict_uploads = Ja   → alleen extensies uit de whitelist
check_mime       = Ja   → de inhoud moet werkelijk van dat type zijn

Met beide opties ingeschakeld wordt een bestand als shell.php dat is hernoemd naar shell.png geweigerd, omdat het gedetecteerde MIME-type geen afbeelding is.

Laat Restrict Uploads en Check MIME Type daarom altijd actief. Ze uitschakelen om een upload werkend te krijgen is een veelvoorkomende oorzaak van beveiligingsproblemen.

6.4 Path traversal en afgeschermde hoofdlocaties

Joomla beschermt zich ook tegen pogingen om buiten de toegestane mapstructuur te komen:

  • Hoofdlocaties worden gevalideerd en systeemmappen zoals administrator, libraries en cli zijn uitgesloten.
  • De LocalAdapter zorgt ervoor dat elk pad binnen de geconfigureerde hoofdlocatie blijft. Een pad als ../../configuration.php kan daardoor niet ontsnappen uit de toegestane map.
  • Bestands- en mapnamen worden opgeschoond met Joomla's padhulpfuncties voordat een schrijfactie plaatsvindt.

6.5 ACL voor acties

Het bestand access.xml van de component definieert gedetailleerde rechten:

core.create   → uploaden en mappen aanmaken
core.edit     → hernoemen en afbeeldingen bewerken
core.delete   → bestanden en mappen verwijderen

Ken deze rechten alleen toe aan vertrouwde groepen zoals Managers en Administrators. Wie bestanden naar de webroot mag uploaden, kan in theorie ook schadelijke bestanden proberen te plaatsen. Beperk schrijfrechten daarom zo veel mogelijk.

Naar boven

7. Achter de schermen (voor ontwikkelaars)

7.1 Geen tabel, maar een servicelaag

Omdat er geen databasetabel bestaat, is de component opgebouwd uit services en plugins:

administrator/components/com_media/
  src/Adapter/AdapterInterface.php      het contract met 12 methoden
  src/Provider/ProviderManager.php      registreert providers / adapters
  src/Model/ApiModel.php                coördineert CRUD-acties
  src/Model/MediaModel.php              model achter de SPA
  src/Controller/ApiController.php      AJAX-endpoints voor de Vue-interface
  src/Controller/DisplayController.php  rendert de SPA-shell

plugins/filesystem/local/   de enige provider uit de core
  src/Adapter/LocalAdapter.php

plugins/media-action/       bijsnijden / formaat wijzigen / roteren
media/com_media/js/         media-manager.js + edit-images.js (Vue)

7.2 De aanvraagstroom

Wanneer je de Media Manager opent, gebeuren er twee dingen: eerst wordt de pagina geladen, daarna neemt de JavaScript-applicatie het over en communiceert met de API:

1. Content → Media
   → DisplayController rendert de Vue SPA-shell
     (één <div> + assets)

2. De Vue-app start → roept de interne API aan:
   → ApiController (com_media&task=api.*)
      of /api/index.php/v1/media/...
   → ApiModel → ProviderManager → Adapter → opslag
   → JSON terug naar Vue → raster wordt opnieuw opgebouwd

De PHP-kant is in feite een lichte JSON-service. De manager zelf is vooral een JavaScript-applicatie. Dat heeft een praktisch gevolg: wil je het uiterlijk aanpassen, dan werk je met CSS en JavaScript-layouts, niet met traditionele PHP-template-overrides.

7.3 De Web Services / interne REST API

De component is API-first. Dezelfde routes worden gebruikt door zowel de single-page app als externe of headless clients:

GET    /api/index.php/v1/media/adapters            lijst met opslagadapters
GET    /api/index.php/v1/media/adapters/{id}       één adapter
GET    /api/index.php/v1/media/files?path=...      lijst met bestanden / mappen
GET    /api/index.php/v1/media/files/{path}        één bestand (metadata / inhoud)
POST   /api/index.php/v1/media/files               uploaden / aanmaken
PATCH  /api/index.php/v1/media/files/{path}        hernoemen / verplaatsen / bewerken
DELETE /api/index.php/v1/media/files/{path}        verwijderen

Deze routes worden geregistreerd door de plugin webservices/media. Omdat de gebruikersinterface exact dezelfde eindpunten gebruikt, kan alles wat de Media Manager kan ook via scripts worden geautomatiseerd. Dat maakt integraties eenvoudig, maar benadrukt ook waarom ACL-rechten strikt moeten worden beheerd.

7.4 Het volledige adaptercontract

Voor ontwikkelaars die een eigen opslagbackend willen bouwen, volgt hier de volledige interface:

interface AdapterInterface
{
    public function getFile(string $path = '/'): \stdClass;
    public function getFiles(string $path = '/'): array;
    public function getResource(string $path);          // stream
    public function createFolder(string $name, string $path): string;
    public function createFile(string $name, string $path, $data): string;
    public function updateFile(string $name, string $path, $data): void;
    public function delete(string $path): void;
    public function copy(string $source, string $destination, bool $force = false): string;
    public function move(string $source, string $destination, bool $force = false): string;
    public function getUrl(string $path): string;
    public function getAdapterName(): string;
    public function search(string $path, string $needle, bool $recursive = false): array;
}

Deze twaalf methoden vormen het volledige contract. Een cloudadapter hoeft niet meer en niet minder te implementeren.

7.5 Drie plugingroepen

De component is uitbreidbaar zonder corebestanden aan te passen dankzij drie plugingroepen:

filesystem      → nieuwe opslagbackends toevoegen
media-action    → nieuwe gereedschappen voor de afbeeldingseditor
webservices     → de REST API uitbreiden of beschikbaar maken

7.6 Miniaturen en afbeeldingsverwerking

Voorvertoningen en miniaturen worden gegenereerd via Joomla's Image-bibliotheek (libraries/src/Image/Image.php), die gebruikmaakt van GD of Imagick. De functies voor bijsnijden, schalen en roteren in de afbeeldingseditor gebruiken dezelfde laag. Ook EXIF-oriëntatie, afmetingen en resampling worden server-side verwerkt.

Het gaat om dezelfde Image-klasse die je ook vanuit je eigen extensies kunt gebruiken. De Media Manager voegt daar alleen een gebruikersinterface bovenop toe.

7.7 Op grotere schaal

Een bestandsgebaseerde beheerder gedraagt zich anders dan een component die op een database draait. Dat heeft gevolgen voor beheer en prestaties:

OnderwerpWaaromOplossing
Grote mappen Een map met 10.000 bestanden uitlezen kost veel tijd en geheugen Opsplitsen in submappen, paginering gebruiken
Zoekkosten search() doorloopt de mapstructuur, er is geen database-index Ondiepe structuren gebruiken en zoeken beperken tot submappen
CPU-belasting van miniaturen Miniaturen genereren kost processorkracht Miniaturen cachen en originelen via een CDN leveren
Externe adapters Elke lees- of lijstactie betekent een netwerkverzoek naar de opslagprovider Resultaten cachen en gesigneerde URL's gebruiken via getUrl()
Back-ups Bestanden staan op schijf en niet in SQL-dumps images/ en files/ apart back-uppen naast de database

Een belangrijke herinnering voor beheerders: een databaseback-up bevat geen mediabestanden. Die staan op het bestandssysteem of in een cloudopslag en moeten afzonderlijk worden meegenomen in je back-upstrategie.

Naar boven

8. Veelgemaakte fouten en valkuilen

8.1 "Mijn upload wordt geweigerd"

Doorloop deze checklist. In vrijwel alle gevallen ligt de oorzaak hier:

  • Staat de extensie in Allowed Extensions?
  • Gaat het om een .docx, .xlsx of .pptx? Deze zijn standaard niet toegestaan. Voeg zowel de extensie als het juiste OOXML MIME-type toe.
  • Is het een .svg? SVG wordt standaard geblokkeerd vanwege XSS-risico's. Schakel het alleen in voor vertrouwde gebruikers en reinig SVG-bestanden vooraf.
  • Wordt het bestand geweigerd door Check MIME? Dan werkt de beveiliging zoals bedoeld. Heb je alleen de extensie toegevoegd maar niet het MIME-type, dan blijft de upload geblokkeerd.
  • Is het bestand groter dan upload_maxsize? Controleer ook PHP-instellingen zoals upload_max_filesize en post_max_size.
  • Heeft de webserver schrijfrechten op de doelmap?

8.2 "Ik zie mijn afbeeldingenmap niet"

  • Bestaat het ingestelde pad werkelijk en is het geldig?
  • Verwijst het pad naar een uitgesloten systeemmap? Dat is niet toegestaan.
  • Is in de boomstructuur de juiste adapter geselecteerd (local-images of local-files)?

8.3 Beveiligingsfouten

  • Schakel Restrict Uploads of Check MIME nooit uit om een upload te forceren.
  • Geef uploadrechten (core.create) niet aan onbetrouwbare gebruikersgroepen. Bestanden naar de webroot kunnen schrijven brengt risico's met zich mee.
  • Onthoud dat een bestand met de extensie .png verborgen PHP-code kan bevatten. MIME-controle vormt hier de belangrijkste verdedigingslaag.

8.4 Back-ups en migraties

  • Databaseback-ups bevatten geen mediabestanden. Maak daarom ook een back-up van de mediadirectories.
  • Verhuis je naar een andere server? Kopieer dan zowel images/ als files/ en controleer daarna opnieuw de bestandsrechten.
  • Hardcoded paden zoals images/... in artikelen kunnen problemen veroorzaken wanneer je later de hoofdlocatie image_path wijzigt.
Naar boven

9. Best practices

Als je maar een paar dingen uit dit artikel onthoudt, laat het dan deze zijn:

  • Media staat op het bestandssysteem, niet in de database. Maak daarom aparte back-ups van de mediamappen.
  • Laat Restrict Uploads en Check MIME altijd ingeschakeld. Schakel ze nooit uit om een upload te forceren.
  • Bepaal je mappenstructuur voordat redacteuren bestanden gaan uploaden, afbeeldingen in /images, documenten in /files.
  • Houd mappen klein en overzichtelijk. Verdeel grote verzamelingen over submappen per jaar, campagne of onderwerp.
  • Bij het toevoegen van een nieuw bestandstype moet je zowel de extensie als het MIME-type toevoegen.
  • Geef core.create alleen aan vertrouwde gebruikersgroepen.
  • Wil je opslag buiten de lokale schijf gebruiken, maak dan een plugin in de groep filesystem die het adaptercontract met twaalf methoden implementeert.
Naar boven

10. In het kort

OPENEN         Content → Media
OPTIES         System → Global Configuration → Media

IMAGE ROOT     image_path  (standaard: images)
               afbeeldingen, afbeeldingskiezers

FILE ROOT      file_path   (standaard: files)
               documenten en downloads

ROOTS INSTELLEN
               plg_filesystem_local "directories"
               → adapters (images + files)

GEEN TABEL     media staat op het BESTANDSSYSTEEM,
               niet in de database

ORGANISEREN    echte mappen
               (geen #__categories, geen lft/rgt)

AFBEELDING BEWERKEN
               bijsnijden / formaat wijzigen / roteren
               = media-action plugins

EDITORKNOP     TinyMCE-afbeeldingsknop
               → Media-modal
               → voegt <img> toe

INSLUITEN      PDF/Office = <a href>
               MP3        = <audio>
               MP4        = <video>
               grote video's → CDN of streamingdienst

MEDIA KIEZEN   <field type="media">
               → knop Selecteren
               → modaal venster

ADAPTER        AdapterInterface met 12 methoden
               = opslagcontract

PROVIDER       filesystem-plugin levert adapter(s)
               core-provider = Local

MANAGERPAD     provider-adapter:/pad
               bv. local-images:/logo.png

EXTENSIELIJSTEN
               allowed / image / audio / video / doc

AUDIO/VIDEO    mp3 en mp4 zijn standaard toegestaan
               → ingebouwde spelers

OFFICE         odt/ods/odp, doc/xls/ppt toegestaan
               docx/xlsx/pptx NIET
               → extensie + MIME toevoegen

SVG            standaard GEBLOKKEERD
               (XML → XSS-risico)
               → svg + image/svg+xml toevoegen
               → bestanden reinigen

BEVEILIGING    restrict_uploads
               + restrict_uploads_extensions

MIME           check_mime
               + upload_mime
               (extensie ≠ inhoud)

GROOTTE        upload_maxsize
               + PHP-limieten

ACL            core.create / core.edit / core.delete
               (access.xml)

API            /api/index.php/v1/media/files
               en
               /api/index.php/v1/media/adapters

UI             Vue SPA (media-manager.js)
               aanpassen via CSS/JS
               niet via tmpl-overrides

BACK-UP        SQL-dump bevat GEEN media
               → maak aparte back-ups van de mappen
Naar boven

11. Samenvatting

De Media Manager vormt de bestandslaag van Joomla: een opslagonafhankelijke, plugin-gestuurde beheeromgeving die door vrijwel alle andere componenten wordt gebruikt als bestandskiezer. Het werkt anders dan de meeste onderdelen van Joomla, en zodra je dat verschil begrijpt, valt de hele architectuur op zijn plaats.

Kort samengevat biedt de Media Manager:

  • Eén centrale beheeromgeving, voor uploaden, bladeren en organiseren van bestanden vanuit vrijwel elk bewerkscherm.
  • Bewerken in de browser, zoals bijsnijden, schalen en roteren van afbeeldingen, waarbij elk gereedschap een vervangbare plugin is.
  • Uitbreidbare opslag, dankzij een adaptercontract met twaalf methoden, waardoor je vandaag lokale opslag en morgen cloudopslag kunt gebruiken.
  • Een API-first ontwerp, waarbij dezelfde REST-endpoints worden gebruikt door zowel de Vue-interface als headless toepassingen.
  • Meerdere beveiligingslagen, waaronder extensie- en MIME-controles, uploadlimieten, afgeschermde hoofdlocaties en ACL-rechten.
  • Een fundamenteel andere structuur, bestanden op schijf in plaats van records in een tabel, en mappen in plaats van categorieën.

Met dit inzicht voorkom je veelvoorkomende problemen zoals een geweigerde .docx-upload, ontbrekende mediabestanden na een migratie of te ruim ingestelde uploadrechten. Tegelijk krijg je een duidelijk beeld van hoe je opslag later kunt uitbreiden naar cloudplatformen.

Of je nu een nieuwe Joomla-site bouwt, een bestaande website migreert of onderzoekt waarom uploads mislukken of mediabestanden verdwenen lijken, het loont om de Media Manager te behandelen als de fundering die hij werkelijk is, en om net zo zorgvuldig met je mediabestanden om te gaan als met je database.

Naar boven
Media in Joomla
Peter Martin
Peter Martin

Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.