Média- és fájlkiszolgáló rendszer (saját CDN)
Önálló szolgáltatás a képeknek, videóknak és fájloknak. Átveszi a platformtól a feltöltést, a feldolgozást és a kiszolgálást, hogy a fő rendszernek ne kelljen a nagy tartalmakkal foglalkoznia.
Én terveztem és fejlesztettem 2026 márciusától.
Egy rendezvényes platformon rengeteg kép és videó van: klublogók, borítók, galériák, sztorik, promóciós videók. Ha ezeket a fő rendszer tárolja és szolgálja ki, lassul az oldal, a nagy fájlok feltöltése pedig sokszor megszakad.
Egy külön, biztonságos szolgáltatást akartam, ami optimalizálja a tartalmat, gyorsan kiszolgálja, a nagy videókat is megbízhatóan fogadja, és egyszerű API-n át használható.
Képek automatikusan
Feltöltéskor WebP konverzió és bélyegkép készül, profilonként beállított méretekkel és minőséggel (logó, borító, galéria, sztori és mások).
Videó streaming
Háttérben készül adaptív stream (480p, 720p, 1080p), egyszerűen beágyazható MP4, bélyegkép és előnézeti kép, hangerő-kiegyenlítéssel.
Feltöltő oldalak
Egyszer használatos, időkorlátos feltöltő linkek húzd-és-ejtsd felülettel és folyamatjelzővel, képre, videóra és bármilyen fájlra.
Nagy fájlok megszakadás nélkül
A feltöltés darabokban történik, darabonkénti újrapróbálással, így egy gigabájtos videó is megbízhatóan megérkezik.
Privát és publikus tartalom
A privát fájlok csak aláírt, időkorlátos címen érhetők el, a publikusak közvetlenül kiszolgálhatók.
API és visszajelzés
Kulcsos hozzáférés kulcsonkénti jogosultságokkal, dokumentált API, állapotlekérdezés és visszahívás (webhook) a feldolgozás végén.
Képek, fájlok és feltöltési munkamenetek végpontjai, kulcsos hozzáféréssel, OpenAPI leírással.
Márka- és ügyfélnevek, valamint személyes adatok nélkül (kivéve az alkalmazás áruházi képeit).
Adaptív videó
480p, 720p és 1080p stream, ami csak lefelé skáláz, és álló meg fekvő videóra is jó. Mellé készül egy sima MP4 is, ha valaki egyszerűen be akarja ágyazni.
Egyszer használatos feltöltő linkek
A feltöltés 30 percig érvényes linken megy, húzd-és-ejtsd felülettel és folyamatjelzővel.
Privát fájlok aláírt linkkel
A privát fájl csak aláírt, időkorlátos címen érhető el, alapból 15 percig.
A közbeékelt hálózati réteg megölte a nagy feltöltéseket
A feltöltés egy kérésben ment, a közbeékelt réteg viszont nagyjából 100 MB-nál és 100 másodpercnél megszakította. Most 20 MB-os darabokban töltök fel, a szerver az utolsó lépésben fűzi össze őket, és ellenőrzi a méretet. Egy darab újraküldése biztonságos, ezért a böngésző négyszer újrapróbálja, egyre hosszabb várakozással.
Feltöltéssel ne lehessen kárt tenni
Letiltottam a futtatható és szerveroldali kiterjesztéseket (exe, php, js és a többi). A típust és a méretet az összefűzés után ellenőrzöm, a videó hosszára pedig van korlát.
A hiba ne vesszen el
A videófeldolgozás háttérben fut. Sikernél és hibánál is visszahívást küld az üzemeltető rendszernek, ötször újrapróbálva, és ha a feldolgozás elbukik, riasztás megy.
Darabolt feltöltés
20 MB-os darabok, amelyeket a szerver az utolsó lépésben fűz össze, majd ellenőriz. Egy darab ismételt elküldése biztonságos. Erre azért volt szükség, mert a közbenső hálózati réteg egy kérés méretét és idejét korlátozza, ami nagy videóknál megszakította a feltöltést.
Háttérfeldolgozó lánc
A videó feldolgozása üzenetsorban fut több lépésben, hiba esetén riasztással. A visszahívás sikernél és hibánál is megérkezik, növekvő várakozású újrapróbálással.
Biztonság
Futtatható és szerveroldali fájltípusok tiltása, típus- és méretellenőrzés, API-kulcs jogosultságok, aláírt URL-ek és maximális videóhossz.
Tárhelygazdálkodás
Lejárt feltöltési munkamenetek óránkénti takarítása, és opcionálisan a feldolgozott videók eredetijének törlése megadott idő után, tárhelyspórolás érdekében.
Megszakadás-biztos feltöltés
A darabok sorszám szerint érkeznek, ugyanazon sorszám újraküldése felülírja a darabot, tehát az újrapróbálás ártalmatlan. Az összefűzés után a méretet ellenőrzi, és hiba esetén takarít.
// Re-sending the same index overwrites the part, so a retry is idempotent.
$request->file('chunk')->move($dir, sprintf('%06d.part', $index));
// ... later, in complete(): assemble the parts in order
$out = fopen($assembled, 'wb');
for ($i = 0; $i < $info['total_chunks']; $i++) {
$part = $dir.'/'.sprintf('%06d.part', $i);
if (! is_file($part)) {
fclose($out);
return response()->json(['success' => false, 'message' => "Missing chunk: {$i}"], 422);
}
$in = fopen($part, 'rb');
stream_copy_to_stream($in, $out);
fclose($in);
}
fclose($out);
if (filesize($assembled) !== $info['size']) {
File::deleteDirectory($dir);
return response()->json(['success' => false, 'message' => 'Size mismatch.'], 422);
}
A platform és az admin egy API-n keresztül kezeli a tartalmakat, a nehéz feldolgozás háttérben fut, a nagy fájlok pedig megszakadás nélkül megérkeznek.
A képek és videók lassítják a rendszeredet?
Ha a feltöltés megszakad, vagy az oldal lassú a nagy tartalmaktól, érdemes megnézni.
További projektek
Fogászati praxismenedzsment
Időpontok, kezelési karton, pénztár, számlázás és hatósági jelentések egy rendszerben, több rendelő számára.
Esettanulmány → WebáruházAutós és outdoor webáruház
Méretpontos termékkereső, akciók és kedvezménykódok, több mint 15 000 kiszolgált rendeléssel.
Esettanulmány → Webalkalmazás és APIJegyértékesítő platform
Jegyvásárlástól a beléptetésig és az utókommunikációig: webes rendszer fizetéssel, számlázással, mobil API-val és közösségi réteggel.
Esettanulmány →