Goedendag PHPhulp. Meteen offtopic beginnen, gelukkig nieuw jaar allemaal. Ontopic:

Ik heb een klein upload scriptje van een website gehaald, dat script kijkt eerst of de extensie bestaat,zo nee: Fout. Zo ja: Uploaden in de map. Die map heeft dezelfde naam als een sessie. Nu heb ik dat wel keurig gespecificeerd in de naam, hij plompt ze toch gewoon in de root dir. Dit is mijn code

<?php
session_start();
error_reporting(-1);
include 'config.php';
$file= $_FILES['userfile']['tmp_name'];
$filename= $_FILES['userfile']['name'];
$tgs[0] = "jpg";
$tgs[1] = "gif";
$tgs[2] = "htm";
$tgs[3] = "html";
$tgs[4] = "php";
$tgs[5] = "php5";
$tgs[6] = "php4";
$tgs[7] = "php3";
$tgs[8] = "xml";
$tgs[9] = "phps";
$extentie = substr($filename, -3);

for ($c = 0; $c < count($tgs); $c++)
{
if ($extentie == $tgs[$c])
{
$extentie_ok = "ok";
$c = count($tgs) + 5;
}
}

//Controleer het bestandstype van het bestand


if ($extentie_ok)
{

copy($_POST['userfile'], $_SESSION['usernames']) ;
echo "Het bestand is geupload onder de naam: $filename";
}


/*Als het bestandstype toegestaan is, bestand uploaden. u kunt het if en else gedeelte weglaten als u alle bestanden toe wilt laten staan. */


else
{

echo 'Bestandstype niet geldig' ;
}
?>

Als mijn gebruikersnaam in de sessie bijv. Kloentje2 is, en ik wil iets uploaden dan komt het bestand in de root dir. Naam: Kloentje2bestandsnaam Als ik deze regel:

<?php
copy($_POST['userfile'], $_SESSION['usernames']) ;
?>

Vervang door:

<?php
copy($_POST['userfile'], "/". $_SESSION['usernames']) ;
?>

Heeft dat ook geen zin. Dan upload hij hem helemaal niet. Wie kan dit probleem voor me oplossen? Alvast bedankt.

Koen Hollander
En waar gebeurt het uploaden van het bestand?
Zo gaat het inderdaad nooit werken. Als je een bestand upload dan zet php die met een tijdelijke naam in een speciale dir. Vanuit die locatie moet je het bestand hernoemen en ergens anders plaatsen. De locatie waar het bestand terechtkomt staat in $_FILES['jouw_upload_input_naam']['tmp_name']. Wil je vervolgens dat geuploade bestand verplaatsen (noodzakelijk overigens, anders verdwijnt het weer als het script klaar is), dan doe je dat met [php]move_uploaded_file[/php].
@Obelix en Idefix
Dat gebeurt op usercp.php?p=upload. Dus een simpel form met een file input box en een submit knop.

@Erwin H
Weer wat leesvoer. Even bekijken

[size=xsmall]Toevoeging op 01/01/2013 13:01:57:[/size]

Deze foutmeldingen krijg ik:

Warning: move_uploaded_file(): The second argument to copy() function cannot be a directory in C:\xampp\htdocs\hosting\upload.php on line 35

Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\phpF703.tmp' to 'kloentje2' in C:\xampp\htdocs\hosting\upload.php on line 35


Ik heb: copy($_POST['userfile'], $_SESSION['usernames']) ;

Veranderd in: move_uploaded_file($file, $_SESSION['username']);
De 'destination' in move_uploaded_file is altijd een volledige naam, dus pad en bestandsnaam.
Nu is dit mijn code: <?php
session_start();
error_reporting(-1);
include 'config.php';
$file= $_FILES['userfile']['tmp_name'];
$filename= $_FILES['userfile']['name'];
$tgs[0] = "jpg";
$tgs[1] = "gif";
$tgs[2] = "htm";
$tgs[3] = "html";
$tgs[4] = "php";
$tgs[5] = "php5";
$tgs[6] = "php4";
$tgs[7] = "php3";
$tgs[8] = "xml";
$tgs[9] = "phps";
$extentie = substr($filename, -3);

for ($c = 0; $c < count($tgs); $c++)
{
if ($extentie == $tgs[$c])
{
$extentie_ok = "ok";
$c = count($tgs) + 5;
}
}

//Controleer het bestandstype van het bestand


if ($extentie_ok)
{
//copy($file, $_SESSION['username'] . $filename);
//copy($_POST['userfile'], $_SESSION['usernames']) ;
move_uploaded_file($file, "/".$_SESSION['username'] ) ;
echo "Het bestand is geupload onder de naam: $filename";
}


/*Als het bestandstype toegestaan is, bestand uploaden. u kunt het if en else gedeelte weglaten als u alle bestanden toe wilt laten staan. */


else
{

echo 'Bestandstype niet geldig' ;
}
?>

Het script zegt dat het goed is gegaan, maar ik zie niks in de map. De CHMOD is 7777
Met mijn eerdere opmerking bedoelde ik wat Erwin wat uitgebreider aangaf.

Koen: hulp kun je met alle plezier krijgen, maar misschien is het een goed voornemen voor 2013 om zelf (meer) moeite te doen.
Het lijkt mij dat je copy/paste doet en als het niet werkt, open je een topic.

Ga eens debuggen.
Je extensie kan dan mogelijk goed zijn, maar dat wil niet zeggen dat de upload is gelukt.
Iets wat jij kennelijk wel als standaard verwacht, omdat je verder geen enkele controle hebt.
Wat zit er in de overige variabelen?
Klopt het pad / de bestandsnaam die je gebruikt?

Ik mag overigens hopen dat je mensen geen php-files laat uploaden (en uitvoeren)...

Ik neem aan dat er in dit stukje script ook nog ergens wordt gecontroleerd of er wel iets is verzonden of dat het script 'maar zo' wordt aangeroepen?

Is je nog niet eerder verteld dat variabelen doorgaans beter buiten quotes kunnen?

Waarom gebruik je op regel 36 bij echo " en op regel 46 '?

Met
$extentie = substr($filename, -3);
haal je, volgens mij, de laatste drie karakters op van de $filename. In de array heb je ook bestandsextensies staan die 4 karakters lang zijn... :s
Wat wil je met
 $c = count($tgs) + 5;
bereiken?
Erwin H op 01/01/2013 13:11:16

De 'destination' in move_uploaded_file is altijd een volledige naam, dus pad en bestandsnaam.

Daar heb je nog niets mee gedaan volgens mij.

Wat wil je met

$c = count($tgs) + 5;

Ik heb werkelijk geen flauw idee. Ik heb nog nooit iets met uploaden gedaan. Ik moet inderdaad meer moeite doen. Kan iemand me dan een verbeterde versie laten zien? Dan weet ik ook wat ik fout doe.
Koen Hollander op 01/01/2013 13:19:43

Het script zegt dat het goed is gegaan, maar ik zie niks in de map. De CHMOD is 7777

Maar het script checkt niet eens of het wel goed is gegaan, het echo't alleen maar een van te voren bepaalde string. Als je (nu echt) de door mij gegeven link gaat bekijken, dan zie je dat move_uploaded_file een boolean teruggeeft om aan te geven of het gelukt is. Misschien dat ook eens checken?

Nu heb ik een if gemaakt die controleert of de extensie goed en EN kijkt of move_uploaded_file true terug geeft, er staat dat het goed is gegaan. Ik zie nog niks in de map.

Reageren