Die File API ist ein zentraler Bestandteil von Moodle und spielt eine entscheidende Rolle für Sicherheit, Zugriffskontrolle und Dateiverwaltung.
🗄️ Speicherung von Dateien in Moodle
📌 Wichtig zu wissen:
- Hochgeladene Dateien werden physisch im
moodledata-Verzeichnis auf dem Server gespeichert - Die Datenbank speichert nur Metadaten, z. B.:
- Referenzen
- Strukturinformationen
- Zugriffslogik
✅ Ein vollständiges Backup benötigt daher zwingend:
- die Datenbank
- UND den Ordner
moodledata
🧩 File Areas – Wie Moodle Dateien organisiert
Nach dem Upload werden Dateien in sogenannten File Areas abgelegt.
Diese sind in der Datenbank definiert und sorgen dafür, dass jede Datei:
- einen eindeutigen Identifikator erhält
- nur in berechtigten Kontexten ausgeliefert werden kann 🔐
🧱 Eine File Area wird definiert durch:
🔹 contextid – aus welchem Kontext stammt die Datei
🔹 component – z. B. course, mod_forum, block_html (Frankenstyle)
🔹 filearea – z. B. intro, post
🔹 itemid
0, wenn es nur eine Instanz gibt- sonst die ID des zugehörigen Datensatzes (z. B. Forenbeitrag)
📘 Beispiel:
- Kurseinführung →
itemid = 0 - Forenbeitrag →
itemid = post_id
🌍 Contexts – Zugriffsbereiche in Moodle
📂 Dateien sind immer an einen Context gebunden:
| Context | Bedeutung |
|---|---|
🏛️ context_system | Gesamte Moodle-Seite (Root) |
👤 context_user | Einzelner Benutzer |
📚 context_coursecat | Kurskategorie |
🎓 context_course | Kurs |
🧩 context_module | Aktivität |
🧱 context_block | Block |
👉 Eine Datei ist nur im jeweiligen Context verfügbar, z. B.:
- Datei im Kurs → nur
context_course - Datei im Block → nur
context_block
🌐 Dateien an Nutzer ausliefern (Serving Files)
📎 Dateien werden nicht direkt vom Dateisystem ausgeliefert, sondern über die File API.
🔑 Entscheidend ist:
make_pluginfile_url()- Optional:
force_download
$url = moodle_url::make_pluginfile_url(
$file->get_contextid(),
$file->get_component(),
$file->get_filearea(),
$file->get_itemid(),
$file->get_filepath(),
$file->get_filename(),
false // kein Zwangsdownload
);
🔐 Zugriffskontrolle: componentname_pluginfile()
Jedes Plugin, das Dateien ausliefert, muss eine Pluginfile-Funktion haben:
📌 Beispiel:
function mod_myplugin_pluginfile(...) {
require_login($course, true, $cm);
if (!has_capability('mod/myplugin:view', $context)) {
return false;
}
send_stored_file($file, DAY_SECS, 0, $forcedownload);
}
✔️ Hier wird geprüft:
- Context
- Filearea
- Login
- Berechtigungen
- Zugehörigkeit zum Datensatz
🛠️ Dateien erstellen mit der File API
🧱 Grundstruktur ($fileinfo):
contextidcomponentfileareaitemidfilepathfilename
📂 Datei aus dem Dateisystem
$fs->create_file_from_pathname($fileinfo, '/tmp/file.txt');
🌍 Datei von einer URL
$fs->create_file_from_url($fileinfo, 'https://example.com/file.txt');
🧵 Datei aus einem String
$fs->create_file_from_string($fileinfo, 'Hello World');
🔁 Datei aus einer bestehenden Datei
$fs->create_file_from_storedfile($fileinfo, $existingfile);
🔍 Weitere wichtige File-API-Funktionen
📑 Alle Dateien einer File Area auflisten
$files = $fs->get_area_files($contextid, 'mod_myplugin', 'post', $postid);
📖 Dateiinhalt lesen
$content = $file->get_content();
oder als File-Handle:
$fh = $file->get_content_file_handle();
⚠️ Nur lesen – niemals schreiben!
⚠️ Immer fclose() aufrufen
💾 Datei lokal speichern (z. B. für Verarbeitung)
$file->copy_content_to('/tmp/file.txt');
🗑️ Datei löschen
$file->delete();
🔄 Dateien verschieben / umbenennen
- Im selben Bereich:
rename() - In andere File Area:
- neue Datei anlegen
- alte Datei löschen
🔄 Dateikonvertierung (z. B. zu PDF)
📌 Voraussetzung: unoconv installiert
$convertedfile = $fs->get_converted_document($file, 'pdf');
🧠 Fazit
✨ Die Moodle File API sorgt für:
- 🔐 Sicherheit
- 🎯 Kontextbasierte Zugriffe
- 🧱 Saubere Struktur
- 🚫 Kein direkter Dateisystem-Zugriff
➡️ Alle Dateioperationen laufen ausschließlich über die File API