ugrás a tartalomhoz

Feltöltött fájl nem másolható

Fedor · 2006. Már. 30. (Cs), 15.53
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

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

tmp_name

Anonymous · 2006. Már. 30. (Cs), 16.01
miért nem használsz $_FILES tömböt:

<?php
$copy=move_uploaded_file($_FILES['foto']['tmp_name'],$pic);
?>
vagy ha a $foto alakhoz ragaszkodsz, akkor nézz utána mi lesz az $_FILES['foto']['tmp_name']-ből. szerintem $foto_tmp_name ha a $_FILES['foto']['name']-ből $foto_name...

gex
2

Nem ezzel lesz a gond

Fedor · 2006. Már. 30. (Cs), 16.09
Kipróbálhatom, bár korábban is többször használtam ezt az alakot, és most is simán kiírja a fájlnevet, csak a másolásnál int be. :-(
3

Kipróbáltam...

Fedor · 2006. Már. 30. (Cs), 16.21
Az eredmény ugyanaz...
4

error értéke?

Anonymous · 2006. Már. 30. (Cs), 16.30
mennyi a $_FILES['foto']['error'] értéke?

gex
5

error értéke:

Fedor · 2006. Már. 30. (Cs), 16.42
0
6

open_basedir restriction? chmod 777?

Dualon · 2006. Már. 30. (Cs), 18.51
Nem tudom, milyen oprendszeren fut a szervered, de ha valamilyen Linux, akkor adj ki chmod 777-et a könyvtárra, és úgy nézd meg, mi történik.

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

Sok kérdésre sok válasz

Fedor · 2006. Már. 31. (P), 08.55
A szervert nem én üzemeltetem, a rendszergazda váltig állítja, hogy ő megadta az írási jogot.

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

Helyben vagyunk

Dualon · 2006. Már. 31. (P), 10.44
Ezért állít be az ember az (otthoni) devszerverén E_ALL-t. :)

Az array to string conversion annyit tesz, hogy neked tömbben van az átadott adatod, a használt függvényed pedig:
bool move_uploaded_file ( string filename, string destination )
Mivel $pic változód string, várhatóan $foto körül lesz a gond.
Teszthez: gettype()

Open basedir-ről: Manual, Safe mode

A szervert nem én üzemeltetem, a rendszergazda váltig állítja, hogy ő megadta az írási jogot.


Nincs FTP hozzáférésed sem? Meglepő!

Szerintem semmi köze nincs ahoz a dolognak, hogy milyen szintaxtist használok [...] Az ízlésbeli különbségen kívűl azért jó a szintaxtis, nem?


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 (!move_uploaded_file($foto, $pic) ?
  "Nem másolható: $pic<br>" :
  "<img src=\"$feltoltes_url/$foto_name\"> $foto_name feltöltve<br>");
De ez már ízlésbeli különbség. :)
9

echo gettype($foto) eredménye: array

Fedor · 2006. Már. 31. (P), 11.15
A $foto tömb, de annak is kell lennie, nem?

FTP kapcsolatom persze van, de ettől még nincs hozzáférésem a beállításokhoz...
10

nem az egész tömböt kell átadni

Hodicska Gergely · 2006. Már. 31. (P), 11.44
Szia!


A $foto tömb, de annak is kell lennie, nem?

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

Közben...

Fedor · 2006. Már. 31. (P), 11.56
Közben magamtól is eljutottam oda, hogy ez így nem megy ,szóval szépen előkerestem a "Tanuljuk meg a PHP5 használatát 24 óra alatt" c. könyvet, és bekopogtam annak a mintafeladatát egy kicsit magamra igazítva:

<?php
if (isset($_FILES['foto'])) 
{
    echo "Név: ".$_FILES['foto']['name']."<br>";
    echo "Méret: ".$_FILES['foto']['size']."<br>";
    echo "Ideiglenes név: ".$_FILES['foto']['tmp_name']."<br>";
    echo "Hiba: ".$_FILES['foto']['error']."<br>";
    if (( $_FILES['foto']['type']=="image/gif" ) || ( $_FILES['foto']['type']=="image/pjpeg" ))
    {
        $forras=$_FILES['foto']['tmp_name'];
        $cel=_DIR_WRITE."/foto/".$_FILES['foto']['name'];
        $url=_MAIN_URL."/foto/".$_FILES['foto']['name'];
        move_uploaded_file($forras,$cel) or die ("Nem lehet másolni");
        $meret=getImageSize($cel);
        $kep="<p><img width='".$meret[0]."' height='".$meret[1]."' src='".$url."'</p>";
        echo $kep;
    }
}
?>
Ez most működik (bár nem látom azt a fene nagy különbséget, ami ezt indokolná), szóval maradok ennél, persze még egy kicsit cizellálgatom egy kicsit (hibaüzenetek, meg ilyesmik), de a lényeg, hogy okés a dolog.
13

tegnap és ma

Anonymous · 2006. Már. 31. (P), 12.13
12

array, FTP chmod

Dualon · 2006. Már. 31. (P), 12.02
A $foto tömb, de annak is kell lennie, nem?


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.
move_uploaded_file($_FILES['urlapmezo']['tmp_name'], $celfile)
chmod
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.
14

továbbképzés :-)

Fedor · 2006. Már. 31. (P), 13.05
Az "annak kell lennie" arra vonatkozott, hogy tudtommal a FILE típusú inputból származó adat automatikusan tömbként jelenik meg, de lehet, hogy ezt csak én éreztem evidenciának.

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