download souboru v zabezpečené oblasti

Ahoj,
mohl by mi , prosim, někdo poradit ?

V zabezpečné oblasti (přihlášení + sessions) bych rád dal uživatelům k dispozici ke stáhnutí obecně nějaký soubor a rád bych, aby se k němu někdo nemohl dostat např. i tím, že si uloží URL do clipboardu.

Má s tím někdo zkušenosti ? Víte, jak ho (soubor) šikovně "schovat" ?
Díky.
H.
Měj php soubor a v něm skript, ve které funkcí header() pošli správnou hlavičku souboru a funkcí readfile() soubor podstrč. Kýžený dokument pak stačí schovat třeba do nesmyslně pojmenovaného adresáře.
Tak to jsem teda ještě nezkoušel
Neměl bys někde náhodou nějaký ukázkový skript ? :-)
...ale nechci tě otravovat :-)

I tak díky.
>>Kýžený dokument pak stačí schovat třeba do nesmyslně pojmenovaného adresáře.

alebo adresar downloads a potom .htaccess:

order allow,deny
deny from all

to by mohol niekto registrovany niekomu povedat url a bol by tam, takto sa tam dostane len PHP a FTP ;)
Asi tak. Jen mi přijde lepší než adresář pojmenovávat nesmyslně, tak mu dát normální jméno a umístit do něj soubor .htaccess s následujcím obsahem:
Order Deny,Allow
Deny from all

Apache pak nikoho dovnitř nepustí.
Dále je problém se "správnou hlavičkou". Zaprvé se musí dát dobrá Content-Type, navíc se mi osvědčilo ještě jednu:
Content-Disposition: attachment; filename=jmeno.dat
Sakra, byl jsem pomalej. Ale ta druhá část platí.
"to by mohol niekto registrovany niekomu povedat url"

on nebude znát url, když mu to podstrčíš do toho souoru download.php

Honza:
já to ještě nezkoušel teda, ale mělo by to vypadat nějak takhle:

if($radne_prihlaseny)
{
Header('Content-Type: MIME typ souboru(to si zjisti)');
readfile('download/soubor.xxx');
}

možná to nepůjde, nezkoušeno
Nevadí, díky :-)
Mohl bys mi, prosim te, priblizit, jak bych to mohl udelat s tim .htaccess a pristupem do adresare ? A s PHP, aby se do adresare dostal jen prihlasenej uzivatel ?
Diky moc.
Honza
adresar so suborom download.php, logoff.php a login.php

login.php
-----------------
if ($user) {
//tu nejako skontroluj ci je registrovany (DB, subor, ...)
session_start();
$_SESSINO["logedin"] = 1;
}else{
//formular na prihlasenie

logoff.php
---------------
$_SESSION["logedin"] = 0;
session_destroy();

download.php
-------------------
if ($_SESSION["logedin"]){
if (file_exist("download/" . $file)){
Header("Content-Type: application/ocet-stream");
readfile("'download/" . $file);
}
}

potom mas podadresar download kde su subory (1.txt, 2.exe, blabla.nieco ...) a .htaccess

obsah .htaccess
order allow,deny
deny from all

a potom volaj download.php v odkazoch ako download.php?file=blabla.nieco a stiahne sa ti subor blabla.ieco z adresara download
Diky moc, Lacope !
Honza
V IE to bohuzel nechodi (predtim jsem to zkousel ve FF).
V IE to pise, ze nemuze stahnout soubor a vypise to celou tu URL adresu : ...&file=file.
Netusim, kde je chyba.
Honza
Krom toho, ze to v IE nechodi, viz predch. prispevek, ve FireFoxu to sice jde, chce to stahnout, ale stahne ho jen malou cast z 300 KB ho oseka jen na 7 KB -> chyba v komprimovanem souboru.

Zkousel jsem tvou variantu s ruznymi obmenami, ale stale nic.
Netusis, kde by mohla bejt chyba ?
Diky H.
Můžete mi s tím, prosím, někdo pomcot ? Viz dva předchozí příspěvky, bohužel to nefunguje, tak jak mi laskavě poradil Lacop .. :-(

Zkoušel jsem více možností, výsledek by se dal popsat výše zmíněnými dvěma příspěvky ode mne.

Díky Honza
tak potom (chvilu som googloval ;))

download.php
-------------------
if ($_SESSION["logedin"]){
if (file_exist("download/" . $file)){
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".basename($file).";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
readfile("$file");
exit();
}
}

toto musi ist
}
inak

http://www.onaje.com/php/article.php4/40
Uz je to lepsi,
ale bohuzel: STALE
Uz je to lepsi,
ale bohuzel: STALE SE STAHUJE JEN CAST TOHO SOUBORU.
TEN SOUBOR MA NA FTP V ADR.DOWNLOAD VELIKOST ASI 800 KB, ALE STAHNE SE POUZE SI 6 KB.

VUBEC NEVIM CIM TO JE ...

NEDA SE TAM NEJAK OSETRIT VELIKOST SOUBORU ?

ALE DEKUJU :-)
A prečetl sis ten soubor? Já bych tipnul, že místo správného obsahu tam bude nějaká chybová hláška PHP.
Ano, precetl, chybovou hlášku to nepíše žádnou, pouze stáhne soubor, který má asi 10-násobně menší velikost ...
tak já nevím ...
H.
A nešlo by ten stažený zkrácený soubor vidět?
Jak videt ? Chceš ho poslat ? Je to zipac, kterej ma normalne 800 KB, ale stazenej pouze 7, takze to pri otevreni nahlasi chyba v komprimovanem souboru, nebo tak neco ...
H.
Honza: Pokud ten stažený zipáč obsahuje normální html nebo php kód, tak je něco zhusta blbě v readfile apod. Pokud ten stažený zipáč obsahuje binární data (a to ze začátku souboru), tak je rovněž něco blbě. Moc ale pomůže, pokud uvedeš, o kteý z těchto dvou případů se jedná.
Zkousel jsem zazipovat jak nekolik souboru PHP, tak i uplne jinej soubor s priponou .max - coz je soubor z produktu 3ds max; kdyz ten max otevru pres F3, tak je plnej "divnejch" znaku - coz je v poradku -v tom programu (3ds max) ho v pohode otevru - takze hadam ze jde o binarni soubor.

U obou zazipovanejch souboru tu velikost zkrati a nejdou otevrit.
H
Zde je cast zdrojoveho kodu: ( je soucasti PHP skriptu - jde o uzivatelskou oblast s loginem a SESSIONS ):

<?
...

if ( IsSet( $stahnout )):
if ($stahnout == "navod"):
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".basename($getZipFile).";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($getZipFile));
readfile("$getZipFile");
exit();
endif;
endif;

...
?>