Media in Joomla
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 componenten | Media 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:
| Hoofdlocatie | Standaardmap | Bedoeld 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.
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:
| Actie | Wat 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:
| Gereedschap | Plugin (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 → Mediagaan.
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>
| Type | Gebruik 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.
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:
| Optie | Standaardwaarde | Functie |
|---|---|---|
Toegestaan (restrict_uploads_extensions) |
bmp,gif,jpg,jpeg,png,webp,avif,ico,mp3,mp4, |
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
/filesof/images, selecteer ze via een mediaveld en ze worden automatisch weergegeven in de preview. mp4staat zowel in de audio- als videolijst; Joomla kiest automatisch de juiste speler.- Wil je
webm,movofogggebruiken? 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:
| Formaat | Extensies | Standaard 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 boven4. 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- ofrgt-waarden. Een bestand verplaatsen betekent letterlijk eenrename()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
/imagesen 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 boven5. 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
imagesenfiles. 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.
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:
| Controle | Optie | Effect |
|---|---|---|
| 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,librariesenclizijn uitgesloten. - De LocalAdapter zorgt ervoor dat elk pad binnen de geconfigureerde hoofdlocatie blijft. Een pad als
../../configuration.phpkan 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 boven7. 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:
| Onderwerp | Waarom | Oplossing |
|---|---|---|
| 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 boven8. 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,.xlsxof.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 zoalsupload_max_filesizeenpost_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-imagesoflocal-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
.pngverborgen 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/alsfiles/en controleer daarna opnieuw de bestandsrechten. - Hardcoded paden zoals
images/...in artikelen kunnen problemen veroorzaken wanneer je later de hoofdlocatieimage_pathwijzigt.
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.createalleen aan vertrouwde gebruikersgroepen. - Wil je opslag buiten de lokale schijf gebruiken, maak dan een plugin in de groep
filesystemdie het adaptercontract met twaalf methoden implementeert.
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 boven11. 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

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


