Autor Zpráva
shark
Profil
Dobrý den,
nevíte jak udělat, aby při stahování souboru uživatel neviděl přesnou url stahovaného souboru?
např: odkaz co uvidí uživatel bude mít tvar pouze : http://www.neco.cz/index.php?stranka=down&id=8
Děkuji za pomoc.
Str4wberry
Profil
Shark: „bude mít tvar pouze : http://www.neco.cz/index.php?stranka=down&id=8

To je ale taktéž přesná URL.
kletely
Profil
shark
To čo si nám povedal je síce moc milé, ale viac by si nám o tom nepovedal?
shark
Profil
Ano, ale já jsem myslel ze pod id "8" bude v databázi uložen odkaz např.: http://www.neco.cz/soubory/soubor.exe
DJ Miky
Profil
Pokud v PHP skriptu pošleš správnou hlavičku (třeba application/octet-stream) a vypíšeš ho pomocí funkce třeba readfile() nebo file_get_contents(), tak uživatel uvidí adresu skriptu, třeba tu tvoji /index.php?stranka=down&id=8.

Skutečná adresa souboru by se mu ukázala v případě, že bys PHP skriptem uživatele na ten soubor přesměroval pomocí header().
kletely
Profil
shark
...
mysql_query("SELECT * FROM down WHERE id={$_GET['id']}");
...
I am
Profil *
DJ Miky
Ale to ten soubor jde zbytečně navíc přes můj server a zatěžuje ho ne? :)
Joker
Profil
ad DJ Miky, vřele doporučuju na tohle použít readfile. Zatímco funkce readfile data souboru prostě "přesype" na výstup, tak file_get_contents ten soubor vrátí jako řetězec- což na serveru sežere tolik paměti, jako je velikost souboru. Takže u většího souboru to zkrachne na nedostatek paměti.

Aneb taky jsem kdysi dělal takovýhle skript a taky jsem v první verzi tuhle chybu udělal :o)))
imploder
Profil
I am
zbytečně to není:
- popis naznačuje, že soubor je uložen na stejném serveru jako skript - www.neco.cz - (myslíš to opravdu tak, sharku?)
- pokud je soubor na jiném serveru a jeho adresa nesmí být prozrazena, pak je tahání souboru nepřímo přes server jedinou možností, jak to zařídit. Tvůj server je pak takový prostředník, který říká "tady nabízím taková a taková data, můžete si je brát, ale odkud jsou vám neřeknu". Logicky to přímým stahováním nejde, to by nebylo žádné utajení.
shark
Profil
Díky za vaše nápady.. Ale ztím se mi nedaří to rozjet.
Imploder : Jo ten soubor se bude stahovat z jiného serveru..Proto bych potřeboval to "utajení". Nechci, aby mi někdo "kradl" ty skutečné url..:o)
imploder
Profil
shark
Nechci, aby mi někdo "kradl" ty skutečné url..:o)
Může ti pak "krást" ty zástupné. I když pak v lozích uvidíš, že se to děje. Bude však zatěžovat tvůj server.

Ale máš vlastně pravdu, pokud ten zdrojový server není pod tvojí kontrolou, tak takhle nad tím kontrolu získáš. Můžeš dělat ty zástupné URL (i dynamicky) platné jenom pro registrované uživatele, omezený čas, atp. a zvenku na to nikdo nebude moct a nebude vidět, odkud se stahuje.

Soubory budou však muset být spíš malé, protože všechno půjde přes tvůj server. Takže na nějaký warez nebo tak se to použít asi nedá.
imploder
Profil
<?php
$cesta = "http://img170.imageshack.us/img170/9331/82ag9.jpg";
Header('Content-Type: application/octet-stream');
Header('Content-Disposition: attachment; filename="image.jpg"');
readfile($cesta);
?>

Stáhne soubor z URL bez jejího prozrazení. Je na to potřeba allow_url_fopen. Takhle je tam však menší problém: prohlížeč neví velikost souboru a tak neví, kolik ještě zbývá stáhnout. Soubor se sice stáhne, ale mezitím Opera zobrazuje nějaké nesmyslné číslo a FF jen běhající proužek. Vyřeší se to posláním správné HTTP hlavičky Content-Lenght. Podobně je to s hlavičkou Content-Type. Obojí by bylo potřeba získat z odpovědi serveru, odkud se soubor tahá, to však pokud vím v PHP umožňuje jenom cURL. Dal jsem tam obecný typ "application/octet-stream", na který prohlížeč nabídne vždycky klasické okýnko k uložení souboru nebo vybrání programu na jeho otevření.
imploder
Profil
imploder
Vyřeší se to posláním správné HTTP hlavičky Content-Lenght. Podobně je to s hlavičkou Content-Type. Obojí by bylo potřeba získat z odpovědi serveru, odkud se soubor tahá, to však pokud vím v PHP umožňuje jenom cURL.
Tak ne, je možné to zjistit dopředu funkcí get_headers().
Toto téma je uzamčeno. Odpověď nelze zaslat.