Feature Wiki
Tabs
IRSS: General Overview of Components to Migrate (ongoing)
Page Overview
[Hide]1 Initial Problem
The central file handling is to be reorganized with the introduction of the File Storage Service. For more information, please check the related project page : [[[Project] ILIAS Resource Storage Service]]
2 Conceptual Summary
IRSS Storage Audit — Components Still Storing Files Outside the IRSS
Goal: map which ILIAS components still persist/read files by legacy means (ilFileSystemGUI,
ilFileUtils/ilUtil, raw PHP fopen/file_put_contents/mkdir, or ILIAS\Filesystem used
directly) instead of routing all binary content through the IRSS (ILIAS Resource Storage Service),
which is meant to become the single storage entry point.
Scope: all 182 dirs under components/ILIAS/. Generated by a per-component grep signal matrix
followed by a domain-grouped read of every component with a file-storage signal. Branch: trunk
(ILIAS 12.0_alpha). Date: 2026-07-02.
⚠ Note: This report was AI-generated and may deviate from reality. Component classifications, verdicts, effort estimates and
file:linereferences reflect an automated audit of the code at the time of writing and can contain errors, omissions or stale citations. Verify against the current source before acting on any finding.
How to read this
- IRSS = target. Markers:
resourceStorage(),ResourceStorage\,IRSSServices,ResourceBuilder,StorableResource,AbstractResourceStakeholder, a persistedridcolumn. - Legacy = anything else that touches disk for persistent domain content:
ilFileSystemGUI(legacy file browser)ilFileUtils::/ilUtil::file helpers (makeDir,moveUploadedFile,getWebspaceDir,delDir,zip, …)- raw PHP fs (
fopen,fwrite,file_put_contents,move_uploaded_file,mkdir,copy,unlink, …) ILIAS\Filesystemservice used directly ($DIC->filesystem()->web()/storage()/temp()) — note IRSS uses this service internally, so calling it directly is a bypass.
Architectural ground truth
IRSS never touches disk itself.
ResourceStorageorchestrates; it injects aFilesystem $fsinto its storage handlers (ResourceStorage/src/StorageHandler/FileSystemBased/AbstractFileSystemStorageHandler.php:54), which wrapsleague/flysystem'sLocalFilesystemAdapter(Filesystem/src/Provider/FlySystem/FlySystemLocalFilesystemFactory.php:68). So Filesystem is the backend, ResourceStorage is IRSS, FileUpload is ingest, VirusScanner is a scan preprocessor, FileDelivery is egress, WebAccessChecker is legacy egress being retired. Everything else is a consumer.
Verdict legend
| Verdict | Meaning |
|---|---|
| MIGRATED | Persistent domain files stored via IRSS. Remaining disk I/O is only transient (temp/zip/export). |
| PARTIAL | Some persistent content on IRSS, some still on legacy disk. |
| LEGACY | Persistent domain content stored on disk, no IRSS. |
| N/A | No persistent file storage of its own (DB-backed, delegates to another component, or pure infra/temp). |
| INFRA | Part of the storage stack itself (backend / ingest / egress / scan / setup). |
Master table
Still to migrate — LEGACY (persistent content on disk, no IRSS)
| Component | What persists on disk (legacy) | Mechanism | ~sites | Effort |
|---|---|---|---|---|
| Course | course file attachments (info tab), member exports, info HTML | ilFSStorageCourse / ilFileDataCourse (ilFileSystemAbstractionStorage) + raw fs |
~20 | high |
| ScormAicc | SCORM/AICC package tree public/data/…/lm_data/lm_<id>, manifest |
base ilObjSAHSLearningModule::getDataDirectory + ilFileSystemGUI + raw fs |
~30 | high |
| Scorm2004 | SCORM 2004 package (webspace), imsmanifest, per-user tracking logs on disk | inherits SAHS dir + fopen/fwrite/file_put_contents; ilFileSystemGUI wired |
~30 | high |
| LearningModule | lm_data/lm_<id> import/export/offline tree, subtitles |
ilFileUtils::makeDir/delDir/zip + fopen/fwrite |
~25 | medium |
| SurveyQuestionPool | question images + material uploads (CLIENT_WEB_DIR/survey/…) |
ilFileUtils::moveUploadedFile + getImagePathWeb |
~29 | medium |
| Survey | survey export/import dirs (svy_data), uploaded import files |
ilFileUtils dir tree + fopen |
~24 | medium |
| CmiXapi | cmi5/xAPI content extracted into webspace object dir | $DIC->filesystem()->web() direct + ilFileUtils |
~10 | medium |
| Verification | certificate verification PDFs | ilVerificationStorageFile extends ilFileSystemAbstractionStorage + file_put_contents/mkdir |
~4 | medium |
| Language | .lang files in CLIENT_DATA_DIR/lang_data |
fopen/fwrite + ilFileUtils::makeDir |
~9 | medium |
| Container | container header/custom icons webspace/container_data/obj_<id> |
ilFileUtils::getWebspaceDir/makeDir + Object custom-icon layer |
~6 | medium |
| DidacticTemplate | template icons (user-uploaded SVG) in web dir | ILIAS\Filesystem direct (webDirectory->write/copy) |
~4 | medium |
| LearningSequence | LSO intro/extro images | move_uploaded_file → STORAGE_WEB |
~2 | medium |
| Saml | SimpleSAMLphp config.php/authsources.php, IdP metadata XML, discovery |
file_put_contents + ILIAS\Filesystem direct (lib expects real paths) |
~7 | high |
| OpenIdConnect | one login-page element image | $DIC->filesystem()->web() direct |
~4 | low |
| LTIConsumer | LTI provider icons (lti_data/provider_icon/) |
$DIC->filesystem()->web()->put direct |
~9 | low–med |
| Authentication | apache-auth allowed-domains .txt |
file_put_contents/file_get_contents |
~6 | low |
| Chatroom | chat-server config file only (not user content) | fopen/fwrite + ilFileUtils::getDataDir |
~4 | low |
| Category | category-import staging dir only | ilFileUtils::getDataDir()."/cat_import" |
~1 | low |
| WebServices | transient REST/ECS payloads (ilRestFileStorage small durable store) |
ilTempnam/fopen/fwrite |
~13 | low |
PARTIAL (IRSS for the primary payload, legacy remnants)
| Component | On IRSS | Still legacy | ~sites | Effort |
|---|---|---|---|---|
| compose-time upload handler (bridge only) | canonical attachment store on disk (ilFileDataMail/ilFSStorageMail), ZIP delivery, cron cleanup |
~20 | high | |
| Export | finished export artifact + registry (export_files table) + download + public-access → IRSS (export_handler stakeholder); one central pipeline, no runtime fallback (see appendix) |
zip assembly on a disk run-dir (then ingested), import extraction on data dir; per-component il<Comp>Exporter reused unchanged; ilImportDirectory uses Filesystem direct |
~25 | high |
| Test | export / results / PDF-archive final zips | assessment question images, tst_data dirs, participant answer dirs, ilTestArchiver builds tree on disk |
~64 | high |
| TestQuestionPool | only assFileUpload answer files |
question image uploads across ~7 question classes, suggested solutions, qpl export dirs; even assFileUpload keeps legacy preview uploads |
~122 | high |
| Style | content styles + content-style images (IRSS container) | ilObjStyleSheet legacy /sty image+export dirs; whole system-style/skin subsystem on disk |
~35 | high |
| Certificate | template files, template zips, bg/tile images | portfolio certificate PDFs on $DIC->filesystem()->storage() direct; bulk-zip + upload helpers |
~10 | medium |
| User | profile pictures (usr_data.rid), new-account-mail attachment |
user-list exports (CSV/XML/Excel), personal-data export ZIP, HTML export, legacy-avatar cleanup remnant | ~18 | medium |
| Badge | badge + template images (image_rid) |
pub_badges/ public OpenBadges publishing tree, residual getImagePath() disk paths |
~13 | medium |
| StudyProgramme | programme type icons | object custom icon (Object service), member-export (ilFSStoragePRG) |
~5 | medium |
| DataCollection | record file fields (rid) |
MOB field media (delegated), XLSX/content export temp | ~7 | low–med |
| OrgUnit | type icons | import XML reads, export zip | ~5 | low |
| Calendar | appointment attachments (read from IRSS) | temp/zip staging for download bundles, ICS import staging | ~13 | low |
| ILIASObject | TileImage via IRSS stakeholder | import upload + custom-icon staging on disk first | ~6 | medium |
| COPage | (content is DB-native XML) | HTML/offline export builder, TeX-render image cache in webspace/output, layout import scratch |
~45 | medium |
MIGRATED (persistent content on IRSS; only transient disk left)
| Component | Notes |
|---|---|
File (ilObjFile) |
versions/revisions + icons + previews all IRSS. Legacy only in XML import/export interchange, setup default-icon scan, transient chunked upload. |
| MediaObjects | mob payload is an IRSS container (mob_data.rid) since ILIAS 10 (ilMobMigration); writes + reads route through the IRSS-backed manager/repo. Legacy tail: exportFiles() rCopy, multi-SRT staging, empty-dir createDirectory(), WAC disk fallback. See appendix. |
| Exercise | submissions, tutor(team) feedback, instruction files, sample solutions, peer-review criteria all IRSS (+ setup migrations). Legacy = zip/download/temp only. |
| Forum | post + draft attachments IRSS (ResourceCollection); old ilFileDataForum is now a delegating wrapper. Legacy = export dir plumbing. |
| HTMLLearningModule | whole HTML package is an IRSS container zip (file_based_lm.rid) + ilHTLMMigration. Reference pattern for the SCORM family. |
| AdvancedMetaData | record file-fields + record-XML exports IRSS (Record/File/). Legacy = import staging + one parse temp. |
| Bibliographic | source .bib/.ris in IRSS. Minor direct-Filesystem copy + dataset export leftovers. |
| IndividualAssessment | grading files IRSS; legacy ilIndividualAssessmentFileStorage marked @deprecated … only used for migration. |
| Poll | poll images + thumbnails in IRSS with crop flavour + ilPollImagesMigration. |
| WOPI | pure IRSS consumer (Collabora/OnlyOffice); stores nothing itself. Good reference. |
| WebDAV | protocol layer; content flows through IRSS (IRSSStreamHandler). Legacy StreamHandler fallback remains. |
N/A (no own persistent file storage)
| Component | Why |
|---|---|
| ContentPage, Glossary, Wiki, Blog, Portfolio | content = COPage (DB); media = MediaObjects (IRSS); only transient exports touch disk |
| MediaCast, MediaPool | delegate all media to MediaObjects (IRSS); only transient download/import zips |
| News | media delegated to MediaObjects (IRSS); no direct fs |
| Contact, Notes, OnScreenChat | DB-backed; no file content |
| PersonalWorkspace, WorkspaceFolder | wrap ilObjFile; only temp export assembly |
| WebResource | web links in DB; only on-the-fly bookmarks.html |
| soap | protocol/adapter layer (+ third-party nuSOAP) |
| Repository | provides the Repository-level IRSS facade (IRSSWrapper) |
| Group, Excel, Form, RTE | export/temp staging, framework upload plumbing, editor config |
| BackgroundTasks_, Database, Logging, Html, Xml, Init, GlobalScreen, Search, Refinery, UI, UICore, UIComponent | infra/temp/cache/asset/read-only |
| Migration | DB-update helper, never touches fs |
INFRA (the storage stack itself)
| Component | Role |
|---|---|
| ResourceStorage | IS IRSS |
| Filesystem | IRSS backend (flysystem local adapter); still also ships legacy ilFileSystemGUI, ilFileData, ilUploadFiles |
| FileUpload | upload ingest → UploadResult consumed by IRSS |
| VirusScanner | upload PreProcessor (scan scratch only) |
| FileDelivery | egress; new src is stream/IRSS-aligned, legacy FileDeliveryTypes remain (PARTIAL) |
| WebAccessChecker | legacy secure /data egress, being retired as IRSS makes it obsolete |
| FileServices | hosts the legacy ilFileUtils toolbox (classes/class.ilFileUtils.php) used repo-wide + IRSS upload/policy/sanitizer services |
| Setup | provisions & validates the on-disk directory layout |
Shared legacy substrates (fix once, many benefit)
These non-IRSS storage layers are leaned on by multiple components — migrating them unblocks several:
ilFileSystemAbstractionStorage— object-id-keyed on-disk tree. Used by: Course (ilFSStorageCourse), StudyProgramme (ilFSStoragePRG), Verification (ilVerificationStorageFile), Mail (ilFSStorageMail), Group (ilFSStorageGroup).- Object custom-icon layer (
webspace/container_data/obj_<id>,object.customicons.factory). Used by: Container, Category, StudyProgramme (object icon). ilFileUtilstoolbox (FileServices/classes/class.ilFileUtils.php) — everyilFileUtils::call in every component resolves here. It is infrastructure, not a per-component store, but retiring it is the endgame.- Export/Import zip build/extract on data dir (
ilExport/ilExportContainer/ilImport/ilImportDirectory) — core infra; the disk-based assembly step sits under many components' export features.
Already covered: MediaObjects payload (mobs/mm_<id>) lives in IRSS since ILIAS 10, so the media of
Glossary / Wiki / Blog / Portfolio / News / MediaCast / MediaPool already sits in IRSS. Those components only
need residual _getDirectory / _getURL call-site cleanup, not a data migration.
Suggested migration priority
Tier 1 — real user content, high value, self-contained-ish
- Mail attachments (deeply disk-coupled, but pure user content)
- Course attachments
- SCORM family (ScormAicc/Scorm2004/CmiXapi) — follow the HTMLLearningModule IRSS-container pattern
(migration already scaffolded on branch feature/12/scorm-irss)
Tier 2 — clean, bounded, low effort (good "Poll-style" stakeholder migrations)
- OpenIdConnect login image
- LTIConsumer provider icons
- Verification cert PDFs
- LearningSequence intro/extro images
- DidacticTemplate icons
- Badge pub_badges/
Tier 3 — finish the PARTIALs
- TestQuestionPool / Test question images + archiver (largest surface, ~186 sites combined)
- Style ilObjStyleSheet legacy path
- Certificate portfolio PDF · User exports
- StudyProgramme / OrgUnit object icons + member export
Tier 4 — shared substrates & infra
- Retire ilFileSystemAbstractionStorage, the Object custom-icon layer, and eventually the ilFileUtils
toolbox; stream-ify Export/Import zip handling; drop WebAccessChecker and legacy FileDeliveryTypes.
Not IRSS targets (leave as-is): Saml (bundled lib needs real paths), Language files, Chatroom server config, Authentication domains file, setup probes, DB dumps, logs, caches, and all transient export/zip/temp scaffolding.
Appendix: MediaObjects — detailed IRSS state
MediaObjects payload is stored in IRSS, migrated in the ILIAS 10 cycle
(components/ILIAS/MediaObjects/classes/Setup/class.ilMobMigration.php, commit 2d78e5a9628,
2024-10-23, registered in class.ilMediaObjectSetupAgent.php). The mobs/mm_ dir API remains in the code
but is no longer the store of record.
What the migration does
ilMobMigration::step()movesCLIENT_WEB_DIR/mobs/mm_<id>into an IRSS container resource viailResourceStorageMigrationHelper::moveDirectoryToContainerResource(), persists theridinmob_data.rid, then deletes the source dir (recursiveRmDir). Empty/absent dirs getrid = '-'.
Runtime is IRSS-first
- Writes — every ingest path routes to the IRSS-backed manager/repo:
addMediaItemFromUpload/FromLocalFile/FromLegacyUpload,replaceMediaItemFromUpload,uploadAdditionalFile→MediaObjectManager::addFile*→MediaObjectRepository(IRSS container). - Reads —
MediaObjectManager::getLocalSrc()→repo->getLocalSrc()→irss->getContainerUri($rid, $location)(MediaObjectRepository.php:186). Falls back to a WAC-signed legacy_getURL()path only when the container returns nothing (un-migrated / offline). ilObjMediaObject::getXML()IL_MODE_OUTPUTis dual-mode: the// pre irss filebranch (class.ilObjMediaObject.php:522-536) usesilWACSignedPath::signFile()on the legacy disk file only if it still exists, otherwisemanager->getLocalSrc()(IRSS). Correct back-compat, not a leak.
Residual legacy call-sites (cleanup, ~6)
| Site | path:line |
Note |
|---|---|---|
exportFiles() |
class.ilObjMediaObject.php:736-737 |
rCopy from mobs/mm_<id>. The central XML export no longer uses it (mob DataSet emits an rscontainer field, streamed IRSS→IRSS), but it is still called by other components' standalone exporters (Test ExportImport/Export.php:253,262, Forum ilForumXMLWriter.php:204, Survey ilSurveyExport.php:123,131, LearningModule ilObjContentObject.php:1457,1472, TestQuestionPool ilQuestionpoolExport.php:180). After ilMobMigration deletes mobs/mm_<id>, those rCopy from a missing source → embedded media silently dropped. Latent cross-component gap. |
| multi-SRT upload | getMultiSrtUploadDir():1735, uploadMultipleSubtitleFile():1751-1755, getMultiSrtFiles():1775 |
stages + unzips the multi-VTT zip inside mobs/mm_<id>/srt/tmp on disk, then reads it back — bypasses IRSS |
createDirectory() |
:433-440, called at :1323 + ilMediaCreationGUI.php:414/604 + ilObjMediaPoolGUI.php:1493 |
creates an empty legacy dir; content is written via the IRSS manager, so the dir/$mob_dir/$file locals (:1324-1326) are vestigial |
getVideoPreviewPic(true) |
:1695-1711 |
filename-only lookup still is_file()-probes the legacy dir; primary getVideoPreviewPic() uses thumbs->getPreviewSrc() (IRSS) |
| static path helpers | _getDirectory():378, _getRelativeDirectory():387, _getURL():395, _lookupItemPath():404, getDataDirectory():1301 |
still return mobs/mm_<id> strings; kept for the fallback + the sites above |
Downstream delegators
Glossary / Wiki / Blog / Portfolio / News / MediaCast / MediaPool store their media as media objects, so
that content lives in IRSS. Their remaining _getDirectory / _getURL references
(e.g. Blog/Posting/class.ilBlogPostingGUI.php:788,806, News/classes/class.ilNewsItem.php:1820,
MediaCast/classes/class.ilObjMediaCastAccess.php:154 dirsize, MediaPool/classes/class.ilObjMediaPoolGUI.php:1493
createDirectory) hit the fallback/vestigial path — call-site cleanup, not a data migration.
Net state: MediaObjects payload is on IRSS since ILIAS 10; the only functional gap is exportFiles() +
multi-SRT staging still touching the now-removed webspace dir.
Appendix: Export component — detailed IRSS state
On IRSS: the finished export artifact (the completed zip) plus its registry, download and
public-access live in IRSS as a container resource owned by the export_handler stakeholder
(ExportHandler/Repository/Stakeholder/Handler.php:37), created via
manageContainer()->containerFromStream() (ExportHandler/Repository/Wrapper/IRSS/Handler.php:62) and
served with consume()->download() (ExportHandler/Repository/Element/Wrapper/IRSS/Handler.php:202-209).
The old disk-scanned export_file_info registry was replaced by table export_files(object_id, rid,
owner_id, timestamp); a one-off migration ingests each existing on-disk zip into IRSS
(Setup/…/ilExportFilesToIRSSMigration.php:97-125, registered Setup/ilExportSetupAgent.php:51).
Still on disk: the zip is assembled on a data-dir "export run dir" first, then streamed into the
IRSS container and deleted (ExportHandler/Manager/Handler.php:180-204:
makeDirParents → exporters write in → writeDirectoryRecursive → delDir). Even createEmptyContainer
builds a temp zip on disk before ingest (Repository/Wrapper/IRSS/Handler.php:52-64). Import extraction is
still fully on the data dir (ilImport/ilImportDirectory, the latter injecting ILIAS\Filesystem directly).
One central pipeline, no fallback. ilExportGUI always delegates to the IRSS ExportHandler —
class.ilExportGUI.php:285-286 (createXMLExport) and :333-356 (createXMLContainerExport). There is no
runtime if(legacy) … else … branch and no feature flag. The legacy ilExport::exportObject()/exportEntity()
survive only for a few direct non-GUI callers: Style (class.ilObjStyleSheetGUI.php:414), COPage layout admin
(class.ilPageLayoutAdministrationGUI.php:371), LearningModule entity export
(class.ilContObjectExport.php:175).
Per-component exporters are reused, not rewritten. Both the new and legacy paths resolve the same
il<Component>Exporter (ilXmlExporter subclass) via ilImportExportFactory::getExporterClass
(class.ilImportExportFactory.php:29-65; new path at ExportHandler/Manager/Handler.php:73) and call
getXmlRepresentation() + head/tail dependency recursion. Binary payloads are emitted by ilDataSet as
typed fields (Export/DataSet/class.ilDataSet.php:307-348):
- rscollection / rscontainer → copied IRSS-container-to-IRSS-container, no disk
(Consumer/ExportWriter/Handler.php:161-165). This is how migrated components (e.g. MediaObjects,
File, Forum) export their binaries.
- legacy directory / exportFiles() output → still written into the disk run-dir, then ingested.
Standalone exports (plugged into ilExportGUI as export options but managing their own files, mostly
disk via ExportHandler/Consumer/ExportOption/BasicLegacyHandler.php:56,87 + deliverFileLegacy, or fully
independent): HTML exports (ilCOPageHTMLExport, ilWikiUserHTMLExport, ilSystemStyleHTMLExport,
ilHTLMExportOptionHTML), Test (ilTestExportOptionARC, ilTestExportOptionXMLRES), DataCollection
(ilDataCollectionExportOptionsXLSX), member exports (StudyProgramme, Membership).
Cross-component gap: ilObjMediaObject::exportFiles() still rCopys from the deleted mobs/mm_<id> dir
and is called by the standalone/on-disk exporters of Test, Forum, Survey, LearningModule and TestQuestionPool
— so embedded media in those exports can be silently dropped after the mob migration. The central pipeline
is unaffected (it uses the rscontainer field).
Migration history by release
When each component's IRSS storage first shipped. Resolved by finding the commit that introduced the
component's earliest IRSS anchor (a *Stakeholder class or a Setup IRSS migration) — following file renames
across the pre-ILIAS-10 Modules/+Services/ → components/ILIAS/ restructure via
git log --follow -S "class <Name>" — then mapping that commit to the earliest release tag that contains it
(git tag --contains … | grep '^v(7|8|9|1[0-9])\.[0-9]+$' | sort -V | head -1; the N>=7 filter drops a
spurious v3.8 SVN-import tag). The release is authoritative (via tag --contains); the date is the
commit's author date, which routinely precedes the release by 1–2 years because features land on trunk long
before the release is cut. For components with several stakeholders across releases, this is the earliest
one; PARTIAL components added further pieces later and still carry legacy remnants (see the tables above).
IRSS launched in ILIAS 7 with ilObjFile as the pilot, then spread release by release.
ILIAS 7 (v7.0, ~2021)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| File | file object versions/revisions | class.ilObjFileStakeholder.php ("Implemented File Object Migration") |
2020-11-12 |
ILIAS 8 (v8.1, ~2023)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| Bibliographic | source .bib/.ris file |
class.ilObjBibliographicStakeholder.php |
2021-07-28 |
| IndividualAssessment | grading files | class.ilIndiviualAssessmentGradingStakeholder.php |
2022-01-04 |
ILIAS 9 (v9.0, ~2024)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| Forum | post + draft attachments | class.ilForumPostingFileStakeholder.php |
2022-09-14 |
| User | profile pictures / avatars | class.ilUserProfilePictureStakeholder.php |
2023-02-28 |
| DataCollection | record file fields | class.ilDataCollectionStorageMigration.php |
2023-03-18 |
| Exercise | submissions, feedback, instructions, solutions, criteria | class.ilExcInstructionFilesStakeholder.php |
2023-08-29 |
| TestQuestionPool | assFileUpload answer files |
class.ilTestQuestionPoolFileUploadQuestionMigration.php |
2023-10-06 |
ILIAS 10 (v10.0, ~2025)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| StudyProgramme | programme type icons | ilStudyProgrammeTypeStakeholder.php |
2023-11-24 |
| OrgUnit | type icons | ilOrgUnitTypeStakeholder.php |
2023-11-28 |
| Calendar | appointment attachments (consumer — reads IRSS) | class.ilCalendarCopyFilesToTempDirectoryJob.php |
2023-12-14 |
| WOPI | edited office documents | WOPIStakeholder |
2024-05-02 |
| HTMLLearningModule | HTML package container | class.ilHTLMMigration.php |
2024-09-13 |
| Style | content styles + images | class.ilContentStyleStakeholder.php |
2024-10-22 |
| Poll | poll images | class.ilPollImagesMigration.php |
2024-10-22 |
| MediaObjects | mob payload → IRSS container | class.ilMobMigration.php |
2024-10-23 |
| AdvancedMetaData | record file-fields + record-XML | Record/File/.../Stakeholder, RecordFilesMigration.php |
2024-10-24 |
| Certificate | template files + background/tile images | ilCertificateTemplateStakeholder.php |
2024-10-24 |
| Badge | badge + template images | ilBadgeTemplatesFilesMigration.php |
2024-10-25 |
ILIAS 11 (v11.0, ~2026)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| Export | export HTML + finished artifact/registry | class.ilExportHTMLStakeholder.php, ilExportFilesToIRSSMigration.php |
2025-01-07 |
| Test | results / export / PDF-archive artifacts | ResultsExportStakeholder.php |
2025-03-22 |
| ILIASObject | TileImage | Properties/CoreProperties/TileImage/Stakeholder.php |
2025-03-25 |
| compose-time attachment upload (bridge) | class.ilMailAttachmentStakeholder.php |
2025-06-16 |
trunk (unreleased — ILIAS 12)
| Component | Migrated content | Anchor | Commit |
|---|---|---|---|
| WebDAV | routes object content through IRSS (consumer) | src/Objects/IRSSStreamHandler.php |
2026-05-01 |
Not yet migrated (no release): every component in the LEGACY table above (Course, ScormAicc, Scorm2004, LearningModule, Survey, SurveyQuestionPool, CmiXapi, Verification, Language, Container, DidacticTemplate, LearningSequence, Saml, OpenIdConnect, LTIConsumer, Authentication, Chatroom, Category, WebServices) has no IRSS migration.
This list shows all the directories that are currently available on a test installation, for example, and gives a realistic picture of what may still need to be migrated. However, many directories are only used for exports, and these can all be migrated. Other types still have to wait, e.g. structured files, as the basis for this will only be implemented with ILIAS 9 (presumably).
Main-Directory | Directory | Main-Type of Files | Status ILIAS 9 |
|---|---|---|---|
iliasdata | HTMLPurifier | Unknown |
|
iliasdata | PersistentCertificates | Single Files |
|
iliasdata | assessment | Unknown |
|
iliasdata | auth | Unknown |
|
iliasdata | bibl | Single Files | Migrated |
iliasdata | bibl_data | Single Files | Migrated |
iliasdata | blog_data | Export |
|
iliasdata | chat | Unknown | was dropped |
iliasdata | chatroom | Unknown | was dropped |
iliasdata | chtr_data | Export |
|
iliasdata | cmix_data | Export |
|
iliasdata | copa_data | Export |
|
iliasdata | course | Export |
|
iliasdata | dcl_data | Export |
|
iliasdata | embedchat | Unknown |
|
iliasdata | exercise | Unknown |
|
iliasdata | feed_data |
| |
iliasdata | files | Unknown |
|
iliasdata | fold_data | Export |
|
iliasdata | forum | Unknown |
|
iliasdata | glo_data | Export |
|
iliasdata | group | Unknown |
|
iliasdata | grp_data | Export |
|
iliasdata | htlm_data | Export |
|
iliasdata | iass_data | Export |
|
iliasdata | ilAdvancedMetaData | Unknown |
|
iliasdata | ilCategory | Export |
|
iliasdata | ilCategoryReference | Export |
|
iliasdata | ilCourse | Export |
|
iliasdata | ilCourseReference | Export |
|
iliasdata | ilExercise | Single Files | Partly migrated |
iliasdata | ilFile | Single Files | Migrated |
iliasdata | ilForum | Single Files | Partly migrated |
iliasdata | ilGroup | Unknown |
|
iliasdata | ilRestFileStorage | Unknown |
|
iliasdata | ilSession | Unknown |
|
iliasdata | ilUser | Export |
|
iliasdata | ilUser_personal_data | Unknown |
|
iliasdata | ilVerification | Unknown |
|
iliasdata | import | Unknown |
|
iliasdata | itgr_data | Unknown |
|
iliasdata | lang_data | Unknown |
|
iliasdata | lm_data | Export |
|
iliasdata | lso_data | Export |
|
iliasdata | magpie_cache | Unknown |
|
iliasdata | Single Files |
| |
iliasdata | map_workfiles | Unknown |
|
iliasdata | mcst_data | Export |
|
iliasdata | mep_data | Export |
|
iliasdata | orgu_data | Export |
|
iliasdata | poll_data | Export |
|
iliasdata | prtf_data | Export |
|
iliasdata | prtt_data | Export |
|
iliasdata | qpl_data | Export |
|
iliasdata | role_data | Export |
|
iliasdata | sahs_data | Export |
|
iliasdata | scorm-import | Unknown |
|
iliasdata | skmg_data | Unknown |
|
iliasdata | spl_data | Export |
|
iliasdata | sty | Unknown |
|
iliasdata | sty_data | Unknown |
|
iliasdata | svy_data | Export |
|
iliasdata | tst_data | Export |
|
iliasdata | upload | Unknown |
|
iliasdata | user_import | Unknown |
|
iliasdata | usrf_data | Export |
|
iliasdata | webr_data | Export |
|
iliasdata | wfe | Unknown |
|
iliasdata | wiki_data | Export |
|
iliasdata | xtst_data | Plugin Files |
|
data | IASS | Single Files |
|
data | LSO | Single Files |
|
data | assessment | Unknown |
|
data | certificates | Structured-Files |
|
data | chat | Unknown |
|
data | chatroom | Unknown |
|
data | container_data | Single Files |
|
data | course | Unknown |
|
data | courses | Unknown |
|
data | css | Unknown |
|
data | custom_icons | Single Files |
|
data | draw | Unknown |
|
data | exercise | Unknown |
|
data | ilBookingManager | Unknown |
|
data | ilDidacticTemplateIcons | Single Files |
|
data | ilExercise | Single Files |
|
data | lm_data | Structured-Files |
|
data | lti_data | Unknown |
|
data | mobs | Structured-Files |
|
data | obj_data | Unknown |
|
data | openidconnect | Unknown |
|
data | orgu_data | Unknown |
|
data | previews | Single Files | Migrated |
data | prg | Unknown |
|
data | prg_data | Unknown |
|
data | pub_badges | Single Files |
|
data | scorm | Structured-Files |
|
data | sec |
| |
data | sec/ilBadge | Single Files |
|
data | sec/ilBlog | Unknown |
|
data | sec/ilIndividualAssessment | Unknown |
|
data | sec/ilPoll | Single Files |
|
data | sec/ilPortfolio | Unknown |
|
data | shop | Unknown |
|
data | srv | Unknown |
|
data | sty | Unknown |
|
data | sty_* | Unknown |
|
data | thumbs | Unknown |
|
data | usr_images | Single Files | Migrated |
data | xnob | Plugin Files |
|
data | xqcas | Plugin Files |
This feature request is used to get the agreement to modify all affected components in release 7. Further feature requests are required. Please note the following overview of the affected components.
Currently (at least) the following modules use ilObjFile and must be modified to use the new file storage service:
- File
- Exercise
- DataCollection
- Bibliography
- Glossary
- Learning module
- SCORM
- Test
- Calendar
- Page Editor
- Weblink
- Session
- Forum
- Profile
Modules that use the page editor must also be modified:
- Wiki
- Blog
- Content Page
- Learning module
- DataCollection
- Containers (Course, Folder, category, group, item group)
- Glossary
- Media pool
- Portolio
- SCORM
- Test
- Authentification
There are also many components that manage the files themselves and store them in the file system. They have to be modified as well. Basically all components that internally use \ilUtil::moveUploadedFile() are also affected.
3 User Interface Modifications
3.1 List of Affected Views
none
3.2 User Interface Details
none
3.3 New User Interface Concepts
none
4 Technical Information
in a first step the file object itself is modified, see: IRSS: Migrate File-Object-Files to IRSS
in this step a wrapper is also built to keep the above components working.
these components should rebuild internally and use the File Storage Service directly
5 Privacy Information
see IRSS: Migrate File-Object-Files to IRSS
6 Security Implications
see IRSS: Migrate File-Object-Files to IRSS
7 Contact
- Author of the Request: Lorenz, Katharina [klorenz]
- Maintainer: Schmid, Fabian [fschmid]
- Implementation of the feature is done by: {The maintainer must add the name of the implementing developer.}
8 Funding
9 Discussion
JourFixe, ILIAS [jourfixe], 11 MAY 2020 : We highly appreciate this suggestion and schedule the feature for ILIAS 7. We will try to implement this new service for as many components as possible for ILIAS 7 and complete the project with ILIAS 8. This feature request covers the implementation also for components that are not listed above. We ask all maintainer to list their components that have already implemented the file storage service (in chap. Implementation).
Schmid, Fabian [fschmid] Implementd for File-Object in ILIAS 7, see IRSS: Migrate File-Object-Files to IRSS
10 Implementation
Please see the linked per-component requests above.
With ILIAS 7 the ResourceStorageService was implemented, which now - from the components that use it - handles the storage of files and their metadata and takes care e.g. of special characters such as german umlauts. That means, on the hard disk no more files with original names are created, but only a resource and the metadata, like also the file name, are exclusively in the database, which can handle special characters very well. This means that the base now provides all the tools to be able to fix the special character problem. In principle, this works in such a way that ILIAS objects can e.g. submit uploads in the storage service and do not have to remember e.g. metadata such as the file name themselves. In the case of the File object in the magazine, this is now the case. For historical reasons, the File object is not only used for the magazine object "File", but other modules also use the File object in the background to store files, including the following modules:
- Datacollection
- Mediaobject
- Forum
- Glossary
- LM
- Mediacast
- Mediapool
Now it depends in the modules, which use the file object internally, whether they store the file name themselves, or whether they set the file name to the file object as a title or just use the information of the respective uploaded file, when it comes to displaying or downloading the file again. Let's assume that the DataCollection receives an upload, stores it as a File-Object and sets the title of the file from Bär.jpg to Baer.jpg and every time the file is downloaded, the DataCollection again takes the title (i.e. Baer.jpg) as the name for downloading, then the DataCollection has to adapt this.
In the medium term, the modules should no longer use the File object to store files, but instead use the Resource Storage service directly. But this needs adaptations to each of these modules, which we are now tackling for ILIAS 8 piece by piece. Then each module can implement this in such a way that, for example, the file name is not set as a title and special characters are replaced, but the module can confidently simply give the upload to the resource storage service and no longer worry about such things. I took the DataCollection as an example earlier, because that's exactly what we're tackling as the first object to come into the JF over the next few weeks. And after that all other objects that currently still use the File object in the background. For the developers of the respective modules it becomes much simpler after the reorganization and a coupling to the file object is thereby also gone, which gives the file object again more clearance, in order to develop itself - with features - further.
But there is still one point to consider. Even if all modules are adapted and use the service and thus actually have the correct file name available when the file is to be downloaded or displayed, there are still cases in which the file name of a downloaded file does not correspond to the original: When delivering file names, ASCII should be used in each case according to RFC https://tools.ietf.org/html/rfc2183#section-2.3, i.e. ILIAS should convert characters in the file name to ASCII and replace unknown (special) characters with "_".
Last edited: 2. Jul 2026, 13:17, Schmid, Fabian [fschmid]