Fájlok letöltése hiba
Sziasztok!
A probléma a következő: Localhoston tökéletesen működik a lenti php fájl Chrome, IE és Firefox alatt de, ha feltöltöm éles tárhelyre, akkor sem a Chrome alatt nem működik, sem IE és Firefox alatt sem jó!
Ötlet?
A php fájlal egy mappában van az arlista mappa, abban 3 db almappa 3 vásárlói csoport számára. Belépéskor kiderül, hogy melyik felhasználó, melyik csoportba van besorolva, ez alapján tud a neki megfelelő mappában levő fájlt letölteni.
Itt a kód:
■ A probléma a következő: Localhoston tökéletesen működik a lenti php fájl Chrome, IE és Firefox alatt de, ha feltöltöm éles tárhelyre, akkor sem a Chrome alatt nem működik, sem IE és Firefox alatt sem jó!
Ötlet?
A php fájlal egy mappában van az arlista mappa, abban 3 db almappa 3 vásárlói csoport számára. Belépéskor kiderül, hogy melyik felhasználó, melyik csoportba van besorolva, ez alapján tud a neki megfelelő mappában levő fájlt letölteni.
Itt a kód:
<?php
// Start the session
require_once('startsession.php');
// Fejléc beillesztése
$page_title = 'Árlista letöltése';
require_once('header.php');
require_once('connect_db.php');
if (!isset($_SESSION['id'])) {
echo '<p class="login">Kérem <a href="login.php">jelentkezzen</a> be!</p>';
exit();
}
// A navigációs menü megjelenítése
require_once('navmenu.php');
if (isset($_POST['submit']))
{ //01
// Változókhoz rendeljük az adatbázisból nyert, POST-tal átadott adatokat
$file_nev = $_POST['file_name'];
$file_meret = $_POST['file_size'];
$file_tipus = $_POST['file_type'];
$csoport_szam = $_POST['file_csoport'];
// Az aktuális könyvtár megadása
switch ($csoport_szam)
{ //02
case 1:
$aktualis_konyvtar = "./arlista/csoport_1/";
break;
case 2:
$aktualis_konyvtar = "./arlista/csoport_2/";
break;
case 3:
$aktualis_konyvtar = "./arlista/csoport_3/";
break;
default:
echo '';
break;
} //02
$file = $aktualis_konyvtar.'/'.$file_nev;
if ( file_exists ( $file ))
{ // nyitó file_exists
header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: application/octet-stream' );
header ( 'Content-Disposition: attachment;
filename='.basename( $file ));
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Expires: 0' );
header ( 'Cache-Control: must-revalidate' );
header ( 'Pragma: public' );
header ( 'Content-Length: '.$file_meret);
ob_clean ();
flush ();
readfile ( $file );
exit;
} // záró file_exists
} //01
// Csatlakozás az adatbázishoz
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
// Lekérdezzük a felhasználó csoportszámának megfelelő feltöltött fájlokat
$csoport_szam = $_SESSION['csoport'];
$query = "SELECT * FROM files WHERE file_csoport = '$csoport_szam'";
$data = mysqli_query($dbc, $query);
mysqli_close($dbc);
$sorok = mysqli_num_rows($data);
if ($sorok > 0)
{ // a nyitó
echo '<table align ="center">';
echo '<caption class="caption">Letölthető Fájl(ok)</caption>';
echo '<tr class="table_fejlec">';
echo '<th id = "fajl" > Fájl </th>';
echo '<th id = "feltoltve"> Feltöltve: </th>';
echo '<th id = "letoltes"> Letöltés </th>';
echo '</tr>';
while ($row = mysqli_fetch_array($data))
{//nyitó while
echo '<tr>';
echo '<td headers="fajl">' . $row['file_name'] .'</td>';
echo '<td headers="feltoltve">' . $row['datum'].'</td>';
echo '<form name="form_user" method="post" action="letoltes.php"/>';
echo '<td> <input type="submit"value="Letöltés" name="submit"/></td>';
echo '<input type="hidden" name="id" value="' . $row['id'] . '" />';
echo '<input type="hidden" name="file_name" value="' . $row['file_name'] . '" />';
echo '<input type="hidden" name="file_size" value="' . $row['file_size'] . '" />';
echo '<input type="hidden" name="file_type" value="' . $row['file_type'] . '" />';
echo '<input type="hidden" name="file_csoport" value="'.$row['file_csoport'].'"/>';
echo'</form>';
echo '</tr>';
} // while záró
echo '</table>';
} // if záró
else
{
echo 'Nincs letölthető fájl!';
}
// Lábléc beillesztése
require_once('footer.php');
?>
Localhoston tökéletesen
Mit jelent, hogy tökéletesen működik, és mit jelent, hogy nem? Mi történik, és minek kellene történnie? Van valami PHP hibaüzenet? Elolvastad a PHP hibanaplót?
Poetro részére
Tehát nem tölti le a fájlt, csak "megnyitja" és ömlesztett karakterek jelenít meg a képernyőn. Azért érdekes, mert a fejlesztés alatt is Chrome-t használok, ott localhost alatt működik (tehát simán letöltöm hibátlanul a fájlt), éles tárhelyre töltve nem (Ott a letöltés helyett " megnyitja"(?) Mintha egy exe fájlt nyitnál meg egy dos-os szerkesztőn, olyan krix-krax karakterekkel tölti meg a képernyőt). Valami nem tetszik a Chrome-nek élesben, csak nem tudom, hogy mi? Mi a hiba a kódaban? vagy ott van-e egyáltalán hiba?
header
header('Content-Disposition: attachment ...
sorban a fájlnevet magát macskakörmök közé kell írni.header('Content-Disposition: attachment; filename="fajlnev%20szokozzel.jpg"');
nem megy úgy se
Example #1 Forcing a download using readfile()
fájlnév
"
) kell rakni.Content-Disposition
Content-Disposition
fejléc hibás, ugyanis a fájlnevet idézőjelbe kell rakni és megfelelően kódolni kell.amit nem értek: localhoston...
Ötlet?
Ugyanaz a fájlnév?
igen
Feltöltöm a tárhelyre (gyumolcstarhely.hu) és nem működik. Most már az IE és FIreFox alatt sem. A weblapon (mindhárom böngészőben)ez jelenik meg:(egy részletet ide másolok) Ez például egy jpg kép...
˙Ř˙ŕJFIF,,˙ŰC ˙ŰC ˙ŔÖ^˙Ä ˙ÄQ !1AQaq"2R#3BbĄą rÁŃ$CS˘˛áđcÂ%4TsŁŇń&Uł˙Ä ˙ÄD!1AQaqĄą"2ÁŃáđBR#3brńC˘Â$%45˛SŇâ˙Ú?ߏdÇ äĆâsÜOx˙}¨č Îâůds"y>Ŕ'¸gýýč˛0InKO0áĚôXŢ]źÇđž°ţ#Ŕ " #wSˇd#%Ăę˙ĺţkYkF9 ; !JÇ>< Ë=Ł´ ;ąí|aÍĺřx ; r?qyäáď(l,aŢ;Ď<\ěc%@RZ2ĂôŁţo÷ŮäĚdq ŕĆ8á d(Úç?Ž¸yk}ÝçßţČ ;~bQöN>öOłüžČB =M5-9Ş˘:x7ĘđÖy^U*SĽi´6ňGęSĽi´7°¤.FŃV°~[¨ibÇÚ$|y(ľĆ`Ż*îŰčFëinňxçŐˇĐ7mť0tÝYŐ´mwÖĽiΡ´Żô0Vŕ ĺÓyKčUV˝uŁďD^¤ˇŐ¸ňkjZ}Ĺoí4žyPš-dČŰŰăEŰĘxˇË<ČŞ y¤ťÍůĘ Î>~PăôL>Ú=ţCłăÜô Žk_kZy !Ć
Próbáltam ezekkeel a kóddal is, amit a neten találtam, például az egyiket egy guru irta itt a weblaboron... http://weblabor.hu/cikkek/allomanyokkiszolgalasaphpbol
Ezekkel sem megy. Tárhely hiba lenne? De mi?
It a kódrészletek: (a megfelelő helyen átírtam a változókat az enyéimre)
Krix-krax
Hol a tárhely? Lehet jó lenne egy php_info() kimenetet látni.
Az elsőben a
header ( 'Content-Type: application/octet-stream' );
sor nem jpg képet jelent. (Akkor "image/jpeg" kellene).Example #1 Download dialog és nézd meg a másodikat is.
ja-ja
A script nem csak jpg-t tölt le, hanem bármely típust. Csak pont egy jpg fájl letöltési "kimenetét" tettem bele demónak.
Írom, hogy localhoston tökéletesen működik, csak éles tárhelyen nem. gyumolcstarthely.hu a tárhely
A "Guru" által írt script sem megy, ezért gyanakszom tárhely problémára, csak nem tudom mi az?
header?
Mielőtt bármit kiküldesz, nem kellene egy ob_start()?
Nem
Kérdezőnek:
- Légyszi vedd a fáradságot linket gyártani! Ne haragudj, nem b... akarlak, csak szeretném elérni, hogy minél szívesebben válaszoljunk neked! Ennek legjobb módja, ha ahol csak tudod, könnyíteni próbálod a dolgunkat. Persze az itteni formázásokat, stb. szokni kell. Ugye nincs harag?
- Nyitóoldalukat megnéztem, elég kommunikatívnak mutatják magukat. Őket megkérdezted?
- Ugye nem ingyenes / reklámos a csomagod? Ha igen, akkor felejtős a header, nem fogod tudni megoldani.
- Attól, hogy különféle (típusú) fájlokat akarsz egy szkriptből kiszolgálni, még stimmelni kell a Content-type-nak. Tehát a fájltípustól függően ezt is a megfelelőre kell állítanod.
- Azt én nem tudom, hogy localhoston mitől működött. Lehet van még valami info amit nem tudunk, jó lenne a két php_info()-t "összefésülnöd". Ami beállítás nem egyezik, írd le ide. (Táblázatot is lehet itt csinálni.)
ok
A phpinfo-ra, csak holnap lesz időm, de azt is felrakom, köszi a segítséget előre is.
phpinfo
baromi sok adat lenne ide ömleszteni.
Melyik részből tudnál valami jót kihámozni?
Késve bár,
- A PHP beállításai közül csak azok lennének érdekesek, amik különböznek a két helyen. Az nem lehet olyan sok (elvileg). Egyébként valszeg a kódoddal lesz gond, de akkor nem kéne működnie localhoston sem.
- Te is említetted már "másik fórumról" azt a content-type-ot, amit én is említettem. Megoldottad, hogy helyes legyen? Ahhoz, hogy megtaláld a megoldást, az is kell, hogy végigjárd az odavezető utat.
(Joed
basename
javaslatának is nézz utána, semmi köze annak a problémának a mysql-hez!)Csak nekem szúrja kia szemem?
Akkor légyszi segíts!
De vajon mitől működik localhoston?
validálás
ellenőrzés
Mivel a $aktualis_konyvtar változót Te állítod be, az biztonságosnak mondható, a baj a $file_nev változóddal van, aminek az értékeét ellenőrzés nélkül a $_POST-ból veszel: $file_nev = $_POST['file_name'];
Nem fogom megoldani helyetted a problémát, de néhány példa, ami problémás lehet:
$_POST['file_name'] = "../../../../../../../../../etc/shadow";
$_POST['file_name'] = "../../../../../../../../../etc/passwd";
$_POST['file_name'] = "../config.inc.php";
Pl. célszerű lenne a biztosítani, hogy a $file_nev változóban tényleg csak fájlnevek vannak és nem relatív elérési útvonalak. Lásd pl. basename().
jogos
egy ilyen megoldás már biztonságos?
$file_nev = mysqli_real_escape_string($dbc, trim($_POST['file_name']));
Egy másik fórumon ezt írták:
A MIME type-t rosszul állítod be, minden fájlt bináris fájlként kezelsz.
header ( 'Content-Transfer-Encoding: binary' );
De akkor melyik a jó beállítás?
NEM
ok