ugrás a tartalomhoz

Fájlok letöltése hiba

sas001 · 2012. Júl. 17. (K), 20.55
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:
<?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');
?> 
 
1

Localhoston tökéletesen

Poetro · 2012. Júl. 17. (K), 21.00
Localhoston tökéletesen működik a lenti php fájl de, ha feltöltöm éles tárhelyre, akkor nem

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?
2

Poetro részére

sas001 · 2012. Júl. 17. (K), 21.08
Már szöszöltem és teszteltem IE és FF alatt, így módosítottam a kérdést!
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?
3

header

Hidvégi Gábor · 2012. Júl. 17. (K), 21.14
A 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"');
5

nem megy úgy se

sas001 · 2012. Júl. 19. (Cs), 09.19
Nos próbáltam, de nem jó valami. A php manualból vettem egyébként a kódrészletet, lásd alább.. Más ötlet?


Example #1 Forcing a download using readfile()
<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    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: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
7

fájlnév

Poetro · 2012. Júl. 19. (Cs), 09.58
A fájlnevet megfelelően kell kódolni, valamint idézőjelbe (") kell rakni.
4

Content-Disposition

Poetro · 2012. Júl. 17. (K), 21.15
Ami biztos, hogy a Content-Disposition fejléc hibás, ugyanis a fájlnevet idézőjelbe kell rakni és megfelelően kódolni kell.
6

amit nem értek: localhoston...

sas001 · 2012. Júl. 19. (Cs), 09.28
...localhoston sián működik mindhárom böngészőben... ?

Ötlet?
8

Ugyanaz a fájlnév?

Poetro · 2012. Júl. 19. (Cs), 09.59
Ugyanaz a fájlnév?
9

igen

sas001 · 2012. Júl. 20. (P), 14.22
Ugyan az a kód, először localhoston fejlesztettem, mindhárom böngészőben simán működik. Bármely típusú fájlt simán le tudok tölteni, a FF és az IE azt is felkinálja, hogy megnyitom vagy letöltöm-e. Minden választásnál simán működik.
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?qƒyäá­ď(l,aŢ;Ď<\ěc%@ R™Z2ĂôŁţo÷Ů䀏Ědq€ € € € € € € € € ŕĆ8á d”(Úç?Ž‘¸yk}‘ÝçßţˆČ€ ;~bQöN>öOłüžČB€ € € €=M5-9šŞ˘:x‡7Ęđ֏y^U*SĽi´—6ňGœęSĽi´—7°¤.FŃV°~[¨ibÇÚ$|y(ľĆ”`Ż*—îŰčFëi nňxçաА7mť0tÝYŐ´mw‹ÖĽi΋ˇ—´Żô0V–ŕ ĺÓyKčUV˝uŁďD ^¤ˇŐ¸ňkjZ}Ĺoí4‡žyPš„Ÿ-dŸƒČŰŰă˜EŰʕxˇË<ŸƒČށ ƒy¤ťÍůʀ € € € Î>~PăôL>Ú=ţCłă܀ô € Žk_k†Zy !Ć

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)

header("Expires: 0");  
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
header("Cache-Control: no-store, no-cache, must-revalidate");  
header("Cache-Control: post-check=0, pre-check=0", false);  
header("Pragma: no-cache");  
//header("Content-type: application/pdf");  
header ( 'Content-Type: application/octet-stream' ); 

// tell file size  
//header('Content-length: '.filesize($file));  

header ( 'Content-Length: '.$file_meret); 
// set file name  
header("Content-disposition: attachment; filename=".$letoltendo_file);  
readfile($file);  
// Exit script. So that no useless data is output-ed.  
exit;  
Itt a másik

$disposition = "attachment"; // "attachment" vagy "inline"  
    $mimeType = "application/octet-stream";  
   // $fileName = "letolt.zip";  
  //  $path = "/var/www-data/dl/$fileName";  
  
    // Egy kis Internet Explorer hack  
    // http://weblabor.hu/levlistak/wl-phplista/2003/03/027752  
    if (isset($_SERVER["HTTPS"])) {  
        header("Pragma: ");  
    }  
    header("Content-Type: $mimeType");  
    header("Content-Disposition:$disposition; filename=\"".trim(htmlentities($file_nev))."\"");  
    header("Content-Description: ".trim(htmlentities($file_nev)));  
    header("Content-Length: ".(string)(filesize($file)));  
    // Ez itt elvileg kell ahhoz, hogy bizonyos alkalmazások mentés  
    // nélkül meg tudják nyitni a letöltött állományt.  
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  
    header("Connection: close");  
  
    readfile($file); 
10

Krix-krax

Pepita · 2012. Júl. 21. (Szo), 05.26
Ilyen csúnya krix-kraxokkal légyszi ne rongáld a szemünket. Írhattad volna azt is, hogy a kép bájtjai a képernyőre kerültek. (legalábbis gondolom ez történt.)

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.
11

ja-ja

sas001 · 2012. Júl. 21. (Szo), 15.51
CSak azért tettem bele a "krix-kraxokat", mert korábban nem volt világos egyeseknek, mi is a hiba jelenség

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?
12

header?

eddig bírtam szó nélkül · 2012. Júl. 21. (Szo), 16.27
Nem lehet, hogy kimegy mondjuk valami reklám vagy egyéb szemét a headerek előtt?
Mielőtt bármit kiküldesz, nem kellene egy ob_start()?
13

Nem

Pepita · 2012. Júl. 22. (V), 00.06
Nekem úgy tűnik, nincs ingyenes / reklámos mutatvány náluk, illetve header előtt nem mehet ki egyetlen bájtnyi tartalom sem. Ha már kiment (reklám), akkor cseszheted, nem tudsz másik header-t kiküldeni, nincs ehhez köze az ob_start()-nak.

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.)
14

ok

sas001 · 2012. Júl. 22. (V), 10.00
A tárhelynek már feltettem a kérdést, várom a válaszukat, ha megjön felrakom.
A phpinfo-ra, csak holnap lesz időm, de azt is felrakom, köszi a segítséget előre is.
15

phpinfo

sas001 · 2012. Júl. 23. (H), 19.57
letöltöttem a php_info-kat
baromi sok adat lenne ide ömleszteni.
Melyik részből tudnál valami jót kihámozni?
23

Késve bár,

Pepita · 2012. Júl. 28. (Szo), 02.52
"de törve nem".
- 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!)
16

Csak nekem szúrja kia szemem?

joed · 2012. Júl. 24. (K), 17.59
Csak nekem szúrja ki a szemem a következő sor?

$file_nev = $_POST['file_name'];  
...
$file = $aktualis_konyvtar.'/'.$file_nev;  
...
readfile ( $file );   
A helyedben megszűrném, megvalidálnám a POST-olt adatokat.
17

Akkor légyszi segíts!

sas001 · 2012. Júl. 25. (Sze), 10.01
Te hogyan írnád át a kódot?

De vajon mitől működik localhoston?
18

validálás

Poetro · 2012. Júl. 25. (Sze), 10.30
Az a baj, hogy ennek segítségével, akárki akármit le tud tölteni a gépedről, nem csak azt, amit szeretnél, csak megfelelően preparálnia kell az URL-t.
19

ellenőrzés

joed · 2012. Júl. 26. (Cs), 13.03
A probléma gyökere az, hogy tetszőleges fájlelérési útvonalat adhatnak meg a kódodnak.
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().
20

jogos

sas001 · 2012. Júl. 26. (Cs), 16.24
ez kimaradt. És köszi, hogy felhívtad a figyelmemet rá!
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?
21

NEM

Poetro · 2012. Júl. 26. (Cs), 16.52
Nem jó. Mert a felhasználó továbbra is le tud tölteni a szerverről akár milyen fájlt, amihez a PHP hozzáfér. Ezzel maximum pár egyébként letölthető fájlt teszel elérhetetlenné azzal, hogy escapeled a nevét.
22

ok

sas001 · 2012. Júl. 27. (P), 09.35
Köszönöm az észrevételt, átdolgozom!