Mikähän mulla menee vikaan tässä php-pätkässä?
Eli uploadaan kuvia palvelimelle.
$folder = $_POST["folder"]; define("UPLOAD_DIRECTORY", "../gallery/$folder/");
Jos kirjoitan polkuun kansion nimen, tämä toimii, mutta kun yritän saada kansion nimen muuttujasta, ei toimi. Jotainhan minä varmaan kirjoitan väärin.
Niin siis mikä oli ongelma?
Oletko tarkistanut muuttujan sisällön?
Sikstoisekseen, varmista ihmeessä ettei muuttujassa ole mitään sinne kuulumatonta, tai aika pian saat huomata että sivustosi on krakkeroitu. Vähintäänkin poista merkit /.\ $_POSTin tarjoamasta tiedosta.
Joo kyllä se ihan oikein tuo tuon arvon eli echo $folder; tuo nätisti kansion nimen johon halutaan uploadata.
echo UPLOAD_DIRECTORY;
En ole defineen heitellyt muuttujia kait kertaakaan, joten en muista/tiedä voiko noin tehdä (ohjelmistoissa on kait yleensä kirjoitettu tunnustietoja suoraan defineen). Tosin minusta parempi tapa olisi yleensä käyttää vaan hipsuja merkkijonojen luomiseen, define('UPLOAD_DIRECTORY', '../gallery/' . $folder . '/');
— joo, siitä tulee vähän pidempi, mutta toisaalta näkee selvemmin että muuttuja liitetään erikseen.
Kokeilin tuota, mutta ei silti tee oikein. echo UPLOAD_DIRECTORY; kirjoittaa polun oikein, kansion nimikin muuttujasta tulee oikein. Unohdin kertoa että tiedosto menee aina tuohon gallery kansioon eli upload toimii muttei oikeaan kansioon. Mikä ihme mulla menee väärin.
No siinä tapauksessa olet esitellyt väärää koodinpätkää :)
No sitten on vielä sen jälkeen tämä
move_uploaded_file($_FILES['file'.$i]['tmp_name'], UPLOAD_DIRECTORY.$_FILES['file'.$i]['name']);
Mitäs kertoo
tai vastaava koodipätkä? Tiedostonimethän nuo ovat?
echo $_FILES['file'.$i]['tmp_name'];
Tämä pätkä ei kerro yhtään mitään.
echo UPLOAD_DIRECTORY.$_FILES['file'.$i]['name'];
Tämä pätkä antaa vain polun eli palautus on ../gallery/test/. Jättää siis tiedostonimen kirjoittamatta. Tästä ilmeisesti voi päätellä jotain. Formin input on muotoa
Nyt testasin vielä sen että jos kirjoitan
$folder = "test"; define('UPLOAD_DIRECTORY', '../gallery/'.$folder.'/');
homma toimii mutta ei silloin jos laitan
$folder = $_POST["folder"];
Testasin tietenkin että echo $folder; antaa oikean nimen eli test. Eli kyse ei olekaan muuttujan sijoittamisesta vaan se ei hyväksy sitä $_postista
katket kirjoitti:
Eli kyse ei olekaan muuttujan sijoittamisesta vaan se ei hyväksy sitä $_postista
$folder = $_POST["folder"];
Jos tuo ei toimi, niin ensimmäisenä epäilisin, ettei $_POST-arrayssa ole folder-avainta.
Piti ihan tarkistaa, että mikä ero on array_key_exists
vs. isset
. Ja vastaus: isset
palauttaa falsen jos taulukon indeksin arvo on null
. Eipä sillä, kyllähän se (isset
) tässä kävisi ja onkin yleisemmin käytetty.
Entäs jos käyttäisit definen sijaan normaalia muuttujaa?
Ensinnä tulisi kyllä mieleen, että olet tuon _FILES-taulukon kanssa jotain mokaillut, jos ei kerran tiedostonimeäkään saa tulostettua. Laita nyt vaikka ihan sivun alkuun var_dump($_FILES)
ja var_dump($_POST)
, niin selviää, mitä palvelimelle edes oikeasti tulee.
tsuriga kirjoitti:
Piti ihan tarkistaa, että mikä ero on
array_key_exists
vs.isset
. Ja vastaus:isset
palauttaa falsen jos taulukon indeksin arvo onnull
. Eipä sillä, kyllähän se (isset
) tässä kävisi ja onkin yleisemmin käytetty.
Semantiikka noissa kallistaa minun kohdalla vaakakuppia array
-funktioiden suuntaan. Jos tarkoitus on selvittää, onko taulukossa joku avain, niin ihan automaattisesti tulee tuo jälkimmäinen kun se ihan sanasta sanaan tarkoittaa sitä. Jollekin toiselle voi isset-tuntua luontevammalta. Toki isset on nopeampi kirjoittaa ja, kun kyseessä on language construct, se toimiikin nopeammin. Perusteita on molempiin suuntiin, mutta minä en tekisi valintaa sentään siksi, että toinen on yleisempi :D
Btw, ainoat array
:t, joissa käytän isset-funkkaria, on juurikin get ja post. Että sikäli.. :-)
Kieltämättä itselläkin jos yleisesti taulukoita ajattelee. Superglobaaleihin taulukoihin sitten issettiä
kun on tottunut ajattelemaan niitä taulukoiden sijaan "onko asetettu tieto x
" -mentaliteetilla.
Metabolix kirjoitti:
mitä palvelimelle edes oikeasti tulee.
PHP:lle ;p.
No niin.
<?php if ( !array_key_exists( 'folder', $_POST ) ) echo 'folder-avainta ei löydy!'; ?>
Ei palauta mitään eli avain ilmeisesti löytyy
<?php // toinen nopea tapa katsoa mitä sieltä parametreista ylimäätään löytyy: echo "<pre>GET:\n"; print_r( $_GET ); echo "\nPOST:\n"; print_r( $_POST ); echo '</pre>'; ?>
Palauttaa test eli kansion nimen jonka valitsin
var_dump($_FILES) ja var_dump($_POST) palauttaa array(0) { } array(0) { } . Mitähän tästä voi päätellä?
Kansion nimi tulee normaalista select name="folder" valikosta. Kokeilin myös type="text" vaihtoehtoa mutta tulos on sama.
Sitten vielä kokeilin ilman defineä seuraavasti
<?php $folder = $_GET['folder']; echo $folder; $uploaddir = '/home/uno4023/public_html/login/gallery/gal/'.$folder.'/'; echo $uploaddir; if (IsSet($_FILES['file1'])) { for($i=1; $i<=4; $i++) { move_uploaded_file($_FILES['file'.$i]['tmp_name'], $uploaddir.$_FILES['file'.$i]['name']); } } ?> //JA FORMI ON SEURAAVANLAINEN <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" ENCTYPE="multipart/form-data"> <?php for($i=1;$i<=4;$i++) { echo " <b>$i</b> <input type=\"file\" name=\"file".$i."\" size=\"75\" ><br>"; } ?> <input type="submit" value="upload" > <input type="reset" value="clear fields"></form>
Lähetätkö sekä GETinä että POSTina? Otat nyt 'folder'in GETistä, aikaisemmin otit POSTista. Formissasi ei muuttujaa 'folder' näy. Onko se siis osoitteessa jo ennestään?
Vaihda PHP_SELF
SCRIPT_NAMEen
, PHP_SELFiin
voi injektoida HTML:ää.
Siis kokeilin kumpaakin get että post. Muttei sillä ollut vaikutusta kumpaa käytti. Tuo formi tuossa on se millä tiedostot uploadataan, ei se mistä folderin nimi tulee. Myöskään tuo SCRIPT_NAME ei tuonut muutosta.
katket kirjoitti:
Siis kokeilin kumpaakin get että post. Muttei sillä ollut vaikutusta kumpaa käytti. Tuo formi tuossa on se millä tiedostot uploadataan, ei se mistä folderin nimi tulee.
Samaan formiinhan ne kannattaisi laittaa, koska vain yhden voi lähettää kerrallaan.
Huomasin myös että kun uploadaan tuolla pätkällä missä kirjoitan koko polun (mikä siis toimii) niin tiedostojen chmodit on niin ettei niitä pysty lukemaan. php:n chmod-funktiolla ei pysty muuttamaan.
Kokeilin tätä samaa hommaa toisella palvelimella ja kaikki toimii hyvin eli ongelma onkin siinä että webolin palvelimella on jotain suojausasetuksia päällä.
Kiitokset kaikille ongelmaa pohtineille.
Aihe on jo aika vanha, joten et voi enää vastata siihen.