Feltöltött fájl nem másolható
Sziasztok!
Van egy képfeltöltő alkalmazásom, ami nem müxik, pedig szerintem kellene. A feltöltéshez a jogosultság megvan a célkönyvtárba való írásra, valahogy mégse megy, mindig a "Nem másolható" if ágra fut, rendesen kiírva a fájlnevet és a célkönyvtárat. Megkérhetnélek titeket, hogy nézzetek rá, hátha egy friss szem felfedez benne olyan hibát, ami fölött én már automatikusan átsiklok?
Előre is köszi.
Üdv,
Fedor
■ Van egy képfeltöltő alkalmazásom, ami nem müxik, pedig szerintem kellene. A feltöltéshez a jogosultság megvan a célkönyvtárba való írásra, valahogy mégse megy, mindig a "Nem másolható" if ágra fut, rendesen kiírva a fájlnevet és a célkönyvtárat. Megkérhetnélek titeket, hogy nézzetek rá, hátha egy friss szem felfedez benne olyan hibát, ami fölött én már automatikusan átsiklok?
Előre is köszi.
Üdv,
Fedor
<?php
if ( isset( $foto ) ) :
$feltoltes_konyvtar = _DIR_WRITE."/foto";
$feltoltes_url = _MAIN_URL."/foto";
if (( $foto_type == "image/gif" ) || ( $foto_type == "image/pjpeg" )) :
$pic=$feltoltes_konyvtar."/".$foto_name;
$copy= move_uploaded_file ( $foto, $pic);
if (!$copy) :
echo "Nem másolható: ".$pic."<br>";
else :
echo "<img src='".$feltoltes_url."/".$foto_name."'>";
echo $foto_name." feltöltve<br>";
endif;
else : echo "<div class='error'>A feltölteni kívánt fájl kiterjesztése nem gif, vagy jpg, hanem ".$foto_type.".</div>";
endif;
else : echo "";
endif;
?>
<fieldset align="center"><legend>Képfeltöltés</legend>
<center>Formátum: *.gif, vagy *.jpg, maximális méret: 0,5 MB.
<form enctype="multipart/form-data" action="<?php echo $PHP_SELF;?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="512000">
<input type="file" name="foto" size="40"><br>
<input type="submit" name="submit" VALUE="Feltöltés">
</form> </center>
</fieldset>
tmp_name
gex
Nem ezzel lesz a gond
Kipróbáltam...
error értéke?
gex
error értéke:
open_basedir restriction? chmod 777?
Emellett open_basedir restriction nincs?
Túl azon, hogy a másolás sikertelenségét jelző ágra fut, más hibaüzenetet nincs?
PHP error reporting szintje? Display errors?
Szerintem egyébként nem a legszerencsésebb az if-nek ezt az alternatív szintaxisát használni, kevésbé elterjedt, ha pl. csapatban dolgozol, zavarhat másokat, stb.
Sok kérdésre sok válasz
Az open_basedir restriction-ről igazából nem tudom, hogy mit takar, folyamatosan tanulom a php-t, amire idáig szükségem volt, azt ismerem, amire meg még nem, azt nem.
Más hibaüzenet nincs alapállásban nincs. Miután a PHP error reporting szintjét beállítottam E_ALL-ra, a következőket írta ki:
Notice: Array to string conversion in /var/www/xxxxxxxxx/page/upload.php on line 23
(A sok x természetesen a valós könyvtárnevet helyettesíti)
A 23. sor az pont a copy parancs. A hibaüzenetet nem pontosan értem: Nem a fájlt próbálja feltölteni, hanem csak a nevét string-gé alakítva?
Szerintem semmi köze nincs ahoz a dolognak, hogy milyen szintaxtist használok, számomra ez átláthatóbb, és egyébként is egyedül dolgozom. Az ízlésbeli különbségen kívűl azért jó a szintaxtis, nem?
Helyben vagyunk
Az array to string conversion annyit tesz, hogy neked tömbben van az átadott adatod, a használt függvényed pedig:
Teszthez: gettype()
Open basedir-ről: Manual, Safe mode
Nincs FTP hozzáférésed sem? Meglepő!
Ahhoz tényleg nincs.
Helyesen amúgy szintaxis, nem szintaxtis. Egyébként Te is tudod a kérdésedre a választ: ha a parser nem jelez hibát, akkor szintaktikailag helyes a kódrészleted.
Én mondjuk behoznék még pl. ilyen rövidítéseket:
echo gettype($foto) eredménye: array
FTP kapcsolatom persze van, de ettől még nincs hozzáférésem a beállításokhoz...
nem az egész tömböt kell átadni
Persze, de a függvény a temp fájl path-jét várja paraméterül, nem az egész tömböt. Ezzel együtt érdemes lenne áttérned a $_FILES tömb használatára. A register_globals on beállítás elég ritka manapság, ezért nem ezt használva nem lesz hordozható a programod, ráadásul következő PHP verziókból akár ki is kerülhet ez a mechanizmus.
Felhő
Közben...
tegnap és ma
gex
array, FTP chmod
Nem értem ezt az "annak kell lennie" kijelentést. $foto az, aminek létrehoztad.
A move_uploaded_file() függvény két stringet, tehát karaktersor típusú paramétert vár, ezt már írtam is, be is linkeltem.
Nézd meg, a $_FILES tömbben képfeltöltés után milyen adatok jellennek meg ( var_dump($_FILES) ), akkor látni fogod, mivel tudsz dolgozni.
Szerintem $foto-t a $_FILES másolataként hozod létre, aminek sok értelme - amennyire rálátok a kódodra - nincs.
Ha FTP kapcsolatod van, akkor adott tárhelyrészletnek Te vagy az ún. owner-e. Unix/Linux rendszereken egy chmod-nak nevezett paranccsal állíthatod be egy állomány v. könyvtár hozzáférési jogait.
Három jog: read, write, execute, ezek "értékei" rendre 4, 2, 1.
Három csoport: owner, group, public, ezek tehát három számjegyet fognak adni.
Egy csoport jogait úgy kapod meg, hogy összeadod a jogosultságaihoz tartozó számokat.
Pl.:
000: adott felhasználónak nincs joga megnyitni a könyvtárat, módosítani, vagy törölni azt, illetve bármi adatmozgást csinálni a könyvtárral kapcsolatban (de hülyén fogalmaztam).
644: owner read write, group read, public read.
Unix/Linux környezetben a képállományod végleges helyre való mozgatásához kell egy 777-es jogosultság a célkönyvtáron. 776-nál még belefuthatsz az open_basedir restriction-be (ha él).
Win kiszolgálón nem tudom, pontosan hogy megy, de ott is kapnod kell jogosultságod a könyvtárra.
Egy FTP klienssel kapcsolódva a szerverhez (én pl. FileZillát használok, filezilla.sourceforge.net) beállítható a jogosultság.
(Filezilla: jobb gomb az állomány nevén, File attributes, s ott akár numerikusan, akár pipálgatva.)
A fórumokon valahol már írtam képfeltöltésről részletes listát (hibakezelés, biztonsági szempontok, stb.), érdemes lenne rákeresned.
Szerk.: Közben írtatok, de - ha ezt már olvasod :) - azért talán hasznos volt ezt is átnézni.
továbbképzés :-)
Mint írtam, az elméleti megalapozottságom nem az igazi, programozói hátterem nincs, mindig azzal ismerkedek meg, amire épp az adott munkámhoz szükségem van, és így gyarapodik a tudásom. Az elsőként alkalmazott módszert régebben már használtam, akkor bevált. Az érdekes az, hogy a "Tanuljuk meg..." könyv előző verziójából származott, igaz, az a PHP4-ről szólt, úgy látszik ez egy jelentős különbség a két PHP verzió között. Mindenesetre ezt a fórumot is megtartom a gyorslinkjeim között, még jól jöhet. Mindig tanul az ember... :-)