POST
Media Ingest API
Strikter Upload-Vertrag fuer artikelgebundene Medien ueber /api/media-ingest. Fuer Content-JSONs ist die url aus der Erfolgsantwort massgeblich.
Endpoint und Auth
| Feld | Status | Hinweis | Beispiel |
|---|---|---|---|
Methode |
Pflicht | POST | "POST" |
Pfad |
Pflicht | /api/media-ingest | "/api/media-ingest" |
Header X-API-Key |
Pflicht | Muss API_INGEST_KEY entsprechen | "dpp-live-7f8a9b2c" |
Header Authorization: Bearer <key> |
Optional | Fallback, falls X-API-Key fehlt | "Bearer dpp-live-7f8a9b2c" |
Header Content-Type |
Pflicht | multipart/form-data | "multipart/form-data; boundary=---123" |
Multipart-Body
| Feld | Status | Hinweis | Beispiel |
|---|---|---|---|
file |
Pflicht | Datei-Upload. Muss erfolgreich mit UPLOAD_ERR_OK ankommen | (Binäre Bilddaten) |
media_type |
Pflicht | img oder vid; muss zur Dateiart passen | "img" |
content_type |
Pflicht | Erlaubt: wissen, blog, whitepaper, produkte, anwendungen, branchen | "produkte" |
category_path |
Pflicht | Slash-String oder JSON-Array, maximal 3 Ebenen | "smart-labels/rfid" |
content_slug |
Pflicht | Kanonischer Slug des zugehoerigen Content-Pieces | "uhf-rfid-smart-label" |
Vollstaendige Content-Beispiele mit passenden Media-Uploads stehen unter Content Payload Examples; der Content-Vertrag steht in der Content Ingest API.
curl -X POST https://example.com/api/media-ingest \
-H "X-API-Key: <API_INGEST_KEY>" \
-F "file=@hero.jpg" \
-F "media_type=img" \
-F "content_type=wissen" \
-F "category_path=compliance/espr" \
-F "content_slug=espr-grundlagen"
Mapping zum Content-Payload
| Content-Ingest Feld | Media-Ingest Feld | Beispiel |
|---|---|---|
content_type |
content_type |
wissen |
category_path |
category_path |
compliance/espr oder ["compliance","espr"] |
content_slug |
content_slug |
espr-grundlagen |
Erlaubte Medien
| Medienart | media_type | Extensions | MIME-Types | Maximalgroesse | Beispiel |
|---|---|---|---|---|---|
| Bilder | img |
jpg, jpeg, png, webp, gif |
image/jpeg, image/png, image/webp, image/gif |
10 MB | hero.jpg |
| Videos | vid |
mp4, webm |
video/mp4, video/webm |
50 MB | demo.mp4 |
Die API prueft MIME-Type per finfo und Dateiendung. Beide muessen zur jeweiligen Medienart passen; die Original-Extension wird nicht in ein anderes Bildformat konvertiert.
Dateinamen und Zielpfade
| Schritt | Verhalten | Beispiel |
|---|---|---|
| Basisname | Dateiname wird kleingeschrieben | RFID_Label.JPG → rfid_label.jpg |
| Sanitizing | Alles ausser a-z, 0-9 und Bindestrich wird zu - |
rfid_label.jpg → rfid-label.jpg |
| Leerer Name | Fallback media-{timestamp} |
---.png → media-1704067200.png |
| Extension | Originale Extension in Kleinbuchstaben | .JPEG → .jpeg |
| Kollisionen | Bestehende Dateien werden nicht ueberschrieben; es wird -1, -2, ... angehaengt |
rfid-label.jpg → rfid-label-1.jpg |
| Rechte | Gespeicherte Datei wird auf 0644 gesetzt |
-rw-r--r-- |
| Medienart | Dateisystem | Response-URL | Beispiel |
|---|---|---|---|
| Bild | content/wissen/compliance/espr/espr-grundlagen/img/{filename} |
/content/wissen/compliance/espr/espr-grundlagen/img/{filename} |
/content/.../img/rfid.jpg |
| Video | content/anwendungen/digitaler-produktpass/usecase-1/vid/{filename} |
/content/anwendungen/digitaler-produktpass/usecase-1/vid/{filename} |
/content/.../vid/demo.mp4 |
Erfolgsantwort
{
"success": true,
"message": "Media file uploaded successfully.",
"url": "/content/wissen/compliance/espr/espr-grundlagen/img/hero.jpg",
"path": "wissen/compliance/espr/espr-grundlagen/img/hero.jpg",
"filename": "hero.jpg",
"mime": "image/jpeg",
"size": 123456,
"media_type": "img",
"content_type": "wissen",
"category_path": ["compliance", "espr"],
"content_slug": "espr-grundlagen"
}
Abgelehnte Legacy-Felder
| Feld | Status | Hinweis | Beispiel |
|---|---|---|---|
taxonomy_type |
Abgelehnt | Verwende content_type | "wissen" |
slug |
Abgelehnt | Verwende content_slug | "my-slug" |
type |
Abgelehnt | Verwende media_type | "img" |
Fehlerantworten
| Status | Ausloeser | Antwort | Beispiel-Szenario |
|---|---|---|---|
| 405 | Methode ist nicht POST |
{"success": false, "error": "Method not allowed. Use POST."} |
GET Request gesendet |
| 401 | Fehlender/ungueltiger API-Key | {"success": false, "error": "Missing or invalid API key. Use X-API-Key header."} |
Falscher Key "12345" |
| 400 | Kein gueltiger Upload in file |
{"success": false, "error": "File upload error. Code: ..."} |
PHP upload_max_filesize ueberschritten |
| 422 | Legacy-Feld vorhanden | Enthaelt legacy_fields |
Payload enthaelt "taxonomy_type" |
| 422 | Strukturfeld fehlt | Enthaelt missing_fields |
Feld "media_type" vergessen |
| 422 | content_type ist ungueltig |
Enthaelt allowed_types |
"magazin" statt "blog" uebergeben |
| 422 | category_path ist leer, ungueltig oder tiefer als 3 Ebenen |
Enthaelt details |
Path ist 4 Ebenen tief |
| 422 | content_slug ist leer oder ungueltig |
Statische Fehlermeldung | Slug enthaelt Leerzeichen |
| 415 | MIME-Type oder Extension nicht erlaubt bzw. mismatch | Enthaelt mime und ext |
.exe hochgeladen oder .jpg mit GIF-Inhalt |
| 413 | Bild groesser als 10 MB | {"success": false, "error": "Image exceeds 10MB limit."} |
15MB TIFF Bild |
| 413 | Video groesser als 50 MB | {"success": false, "error": "Video exceeds 50MB limit."} |
200MB 4K Video |
| 500 | Datei konnte nicht gespeichert werden | {"success": false, "error": "Failed to save the file to disk."} |
Berechtigungsproblem im /content/ Ordner |
Verwendung in Content-JSONs
Die url aus der Erfolgsantwort ist fuer Media-Felder in Content-JSONs gedacht. Lokale Bildfelder werden als Fallback auf eine eindeutig vorhandene gleichnamige Datei mit anderer Bildendung normalisiert.
{
"content": {
"media": {
"heroimage": "/content/wissen/compliance/espr/espr-grundlagen/img/hero.jpg",
"alt": "Beschreibung des Hero-Bildes"
}
}
}