URL, streaming a sťahovanie
Verejné médiá majú priame URL z disku — cez handle vlastníka alebo priamo na Media:
MediaLibrary::for($user)->url('avatar'); // first media's URL, the fallback, or ''
MediaLibrary::for($user)->url('avatar', 'thumb'); // first media's variant URL
$media->getUrl(); // original (public media)
$media->getUrl('thumb'); // a named variant (on the variants disk)Súkromné a dočasné URL
Súkromné médiá verejné URL nemajú, preto použite dočasné URL: na podporujúcich diskoch (S3 a každý driver s temporaryUrl()) ho natívne podpíše, inak prejde na podpísanú streamovaciu routu Laravelu. Bez zadanej platnosti sa použije temporary_url_default_lifetime. Veľké súbory sa streamujú efektívne vrátane obnoviteľných čiastočných sťahovaní:
// Private media has no public URL — getUrl() throws. Use a temporary URL:
MediaLibrary::for($user)->temporaryUrl('avatar', expiry: now()->addMinutes(10));
$media->getTemporaryUrl(now()->addMinutes(5));
$media->getTemporaryUrl(now()->addMinutes(5), 'thumb');
// presigned on S3-like disks, or a Laravel signed streaming route on local/cold disks
return $media->toResponse($request); // stream inline (safe types), range-aware
return $media->toDownloadResponse('invoice.pdf'); // as an attachmentStreamovacia routa
Balík zaregistruje GET {prefix}/{media}/{variant?} s názvom media.stream. {media} sa viaže podľa UUID a routa spúšťa nakonfigurovaný middleware plus middleware signed od Laravelu, ktorý sa pripojí vždy; ?download=1 v podpísanej URL vráti súbor ako prílohu. Bez platného podpisu (alebo na diskoch s natívnym podpisovaním bez podpísanej URL) routa nič nevydá:
'stream' => [
'enabled' => true, // register the signed streaming route
'route_prefix' => 'media', // URI prefix
'middleware' => ['web'], // Laravel's 'signed' is always appended
],Čo sa servíruje inline
Inline sa servírujú len typy, ktoré prehliadač zobrazí bez spúšťania čohokoľvek — rastrové obrázky, audio, video, PDF a obyčajný text. HTML, SVG, XML a všetky ostatné typy sa posielajú ako príloha a každá odpoveď nesie X-Content-Type-Options: nosniff a izolujúcu Content-Security-Policy, takže uložený súbor nikdy nespustí skript na pôvode vašej aplikácie. Variant sa servíruje s typom vlastného formátu. Nečitateľná alebo viacnásobná hlavička Range sa ignoruje (celý súbor, 200); rozsah za koncom súboru dostane 416.
Súkromné médiá potrebujú súkromný disk
->private() / withVisibility('private') nastaví viditeľnosť súboru — ACL objektu v S3 alebo režim 0600 na lokálnom disku. Nezastaví však webový server, ktorý disk servíruje priamo: predvolený disk public je cez symlink pod public/storage, takže súkromný súbor uložený na ňom sa dá stiahnuť z /storage/{uuid}/{file} všade, kde webový server beží pod používateľom PHP — a uuid je v každej podpísanej URL. Súkromné skupiny držte na disku, ktorý webový server neservíruje, napríklad na disku local od Laravelu (storage/app/private) alebo v súkromnom S3 buckete:
// Keep private buckets on a disk the web server does not serve.
$this->addMediaBucket('invoices')
->useDisk('local') // storage/app/private — not symlinked under public/storage
->private();Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.