Portál AbcLinuxu, 11. května 2025 07:38
https://www.xxx.zzz/AAA/BBB/C.txtMuze byt soubor C.txt klidne ulozeny v adresari /www/data/ a nemusis vytvaret /AAA/BBB/. Format URI je ciste tvoje vec a muze tam byt cokoli. Pokud chces jedinecne URL. Ukladej si do tabaze nejaky vygenerovany "hash" na ktery budes odkazovat:
id | soubor | hash 0 | C.txt | 79054025255fb1a26e4bc422aef54eb4Vsechny soboury muzes ukladat na jedno misto, treba /www/data/ a soubor se ulozi jako '79054025255fb1a26e4bc422aef54eb4'. Kyz zadas:
https://www.xxx.zzz/79054025255fb1a26e4bc422aef54eb4Retezec se porovna z databazi a vrati /www/data/79054025255fb1a26e4bc422aef54eb4 jako C.txt a dalsi 1000 a jedna moznsti.
Ale nextcloud mi neresi automatické vytvareni tech adresaru podle ID. Vyhodou by mozna bylo ze to muze hned nasdilet.
id | soubor | path | hash 0 | C.txt | 79/05/40/25255fb1a26e4bc422aef54eb4 | 79054025255fb1a26e4bc422aef54eb4alebo
id | soubor | path | hash 0 | C.txt | 790/540/25255fb1a26e4bc422aef54eb4 | 79054025255fb1a26e4bc422aef54eb4
Teoreticky to jde, můžeš napsat v PostgreSQL funkci, která zavolá systémový příkaz mkdir
(nebo spíš sudo ... mkdir ...
), a tuhle funkci volat z triggeru/pravidla při vkládání záznamu do tabulky.
Ale nepřijde mi to jako dobrý nápad a nemyslím si, že by to vůbec bylo potřeba. Ten program (PHP?), který bude vytvářet soubor přece musí vědět, v jaké složce ho vytváří - tudíž si tu složku může vytvořit sám před vytvořením souboru. Tím pádem to nemusíš složitě řešit v PostgreSQL (je to trochu bezpečnostní riziko, zbytečná komplikace, DB ti běží pod jiným uživatelem...).
Další věc je, že adresářová struktura na disku vůbec nemusí odpovídat struktuře URL. Požadovaný soubor můžeš poslat buď z PHP skriptu nebo pokud máš aplikační server, tak stačí nastavit HTTP hlavičku X-Accel-Redirect
nebo X-SENDFILE
a tím říct HTTP serveru, který soubor má poslat – data pak netečou přes aplikační server, nezatěžují ho a servíruje je přímo Apache nebo Nginx z disku.
V te aplikaci mohu jako dalsi atribut prvku pouzit url adresu, ktera bude obsahovat to ID. Kliknutim na toto url spustim php script, ktery zkontroluje zda adresar existuje a pokud ne tak ho vytvori. Pouzije na to to ID z url.
Tam jen pozor na to, že uživatel (potenciálně útočník) si může ten URL parametr přepsat a poslat tam, co chce. Takže bych to udělal nějak takhle:
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.