Uploaden van een foto
Iemand enig idee? Hieronder het script.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if ($_POST["knop"]) {
$doelbestandsnaam = "plaatje";
$pad = "C:/xampp/htdocs/leerphp/images";
if (is_uploaded_file($_FILES['afbeelding']['tmp_name'])) {
// bestandgrootte controleren
if ($_FILES['afbeelding']['size'] > 150000){
echo "Het bestand is te groot";
exit;
}
//extensie controleren
if (!preg_match("/((.gif|.jpg|.png)$)/", $_FILES['afbeelding']['name'], $extensie)) {
echo "Het bestand is niet van het juiste type";
exit;
}
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])){
echo "Het bestand kon niet verplaatst worden";
}
echo "Het bestand ".$_FILES['afbeelding']['name']." is geupload";
} else {
echo "Het uploaden is niet gelukt";
}
} else {
?>
if ($_POST["knop"]) {
$doelbestandsnaam = "plaatje";
$pad = "C:/xampp/htdocs/leerphp/images";
if (is_uploaded_file($_FILES['afbeelding']['tmp_name'])) {
// bestandgrootte controleren
if ($_FILES['afbeelding']['size'] > 150000){
echo "Het bestand is te groot";
exit;
}
//extensie controleren
if (!preg_match("/((.gif|.jpg|.png)$)/", $_FILES['afbeelding']['name'], $extensie)) {
echo "Het bestand is niet van het juiste type";
exit;
}
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])){
echo "Het bestand kon niet verplaatst worden";
}
echo "Het bestand ".$_FILES['afbeelding']['name']." is geupload";
} else {
echo "Het uploaden is niet gelukt";
}
} else {
?>
<form enctype="multipart/form-data" action="" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="15000" />
Upload afbeelding: <input name="afbeelding" type="file" />
<input type="submit" value="Uploaden" name="knop" />
</form>
$pad.$doelbestandsnaam.$extensie[0]
...
Dit betekent dat $pad moet eindigen met een / .
Dus sowieso moet dat worden
$pad = "C:/xampp/htdocs/leerphp/images/";
Gewijzigd op 17/10/2012 14:42:40 door Kris Peeters
Maar dat verklaart nog niet de fout.
lees eens http://www.tizag.com/phpT/fileupload.php. je ziet daar dat is_uploaded_file() niet gebruikt wordt. Wat mij betreft kun je regel 5 en dus ook regel 20 tm 22 er uit halen. met move_uploaded_file() komt de fout dat er geen bestand is toch wel aan het licht. de foutmelding van regel 17 kun je dan beter wel even aanpassen naar iets als 'het uploaden is niet gelukt probeer het later nog eens'
Groet frank
Gewijzigd op 18/10/2012 00:44:31 door Frank Nietbelangrijk
Het is niet aan te raden om 'het echte pad' op te geven wat je op regel 4 doet. Maar bijvoorbeeld alleen /images.
Tevens controleer je niets in je if statements, wat een beetje raar is.
Code (php)
1
2
3
4
2
3
4
<?php
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])
//dit ook geen goede if statement*
?>
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])
//dit ook geen goede if statement*
?>
Het is bijvoorbeeld
Dit pas je ook zo toe bij de if is_uploaded_file statement om te kijken of het gevult is. Je kunt ook empty gebruiken, beide doen in principe het zelfde alleen omgedraaid!
isset kijkt of er een waarde is, en empty kijkt of er geen waarde is. !isset kijkt of er geen waarde is, en !empty kijkt of er wel een waarde is.
Gewijzigd op 18/10/2012 07:47:51 door Chris PHP
@Chris: jouw beredenering klopt niet volledig. Zowel is_uploaded_file() en move_uploaded_file() returnen allebei true on succes en false bij een failure. Die if statements zijn dus prima in orde.
Ozzie PHP op 18/10/2012 08:20:04:
@Chris: jouw beredenering klopt niet volledig. Zowel is_uploaded_file() en move_uploaded_file() returnen allebei true on succes en false bij een failure. Die if statements zijn dus prima in orde.
Ik zeg ook niet dat ze niet prima zijn, echter is het niet gebruikelijk om ze niet te controleren. Bijvoordbeeld met een isset of if (is_uploaded_file($_FILES['afbeelding']['tmp_name']) == true ). Voor zover ik weet krijg je ook in elk PHP boek bij if statements een controle, en niet alleen if (is_uploaded_file($_FILES['afbeelding']['tmp_name'])) bijvoorbeeld.
Tevens heb ik nog nooit een if statement gezien waar zo gecontroleerd wordt met een , ertussen.
Aanghezien ze aan het leren is, kun je het toch net zo goed meteen correct doen niet dan?
Ze worden wel gecontroleerd... de functie zelf geeft 'true' of 'false' terug. Feitelijk staat er dus dit:
if (TRUE) {
...
}
"Tevens heb ik nog nooit een if statement gezien waar zo gecontroleerd wordt met een , ertussen."
Ik weet niet wat je hiermee bedoelt. Die komma is gewoon een scheiding van parameters binnen de functie.
Hoe weet jij nu of je controleerd of true of false? Als je eenmaal meer uitgebreidere scripts gaat schrijven controleer je welleens op true en in sommige situaties op false. Als je het niet controleerd en aangeeft wat je verwacht, verlies je compleet het overzicht van je script en wordt troubleshooten heel lastig.
Want van een script met 30 regels is dat nog wel te overzien, maar wanneer het er 200+ gaan worden is het verhaal compleet anders. Nogmaals de TS is aan het leren, waarom het op deze manier aanleren wanneer de kans groot is dat je in de problemen komt.
Over de comma , ik heb een ) over het hoofd gezien, dus niet in de gaten gehad dat het extra parameters waren voor de move_uploaded_file. Dus dat is een domme leesfout van mij ;)
Omdat die functies altijd true of false returnen. Dit kun je per functie terugvinden op php.net. Bij een functie die true of false retourneert is een dergelijke controle gebruikelijk.
"Over de comma , ik heb een ) over het hoofd gezien, dus niet in de gaten gehad dat het extra parameters waren voor de move_uploaded_file. Dus dat is een domme leesfout van mij ;)"
Kan gebeuren ;)
Dan weet je toch dat hij checkt op true? PHP doet dit standaard en zal dan nooit controleren op false.
Zo zou je false kunnen checken met:
Ozzie PHP op 18/10/2012 08:56:59:
"Hoe weet jij nu of je controleerd of true of false"
Omdat die functies altijd true of false returnen. Dit kun je per functie terugvinden op php.net. Bij een functie die true of false retourneert is een dergelijke controle gebruikelijk.
Omdat die functies altijd true of false returnen. Dit kun je per functie terugvinden op php.net. Bij een functie die true of false retourneert is een dergelijke controle gebruikelijk.
LOL, ik weet dat het altijd true of false is. Maar wanneer verwacht je een true en wanneer een false, als je niet defineert wat je verwacht?
Stel $_POST['test'] moet gevult zijn, en ik maak if ($_POST['test']). Nu schrijf ik dus een script dat er 'vanuit' gaat dat hij gevult moet zijn, zoniet gaat hij naar de else.
Maar wat als ik nu verwacht dat hij false is? Hoe kun jij nog zien wat het doel van je if statement is, wanneer je dit niet defineert?
Snapt u een beetje wat ik bedoel? :D
Zie de opmerking van Stefan hierboven. Duidelijk genoeg toch?
Ik zou geen uploadsysteem kunnen schrijven zonder op tizag te kijken, en dat terwijl ik het zeker meer dan 5 keer gebruikt heb. Ik zou de instructies op tizag.com gewoon volgen. Geweldige tutorials heeft die site.
Zo kun je het idd ook doen, echter zet ik er persoonlijk liever == true of false achter, omdat dit gewoon veel duidelijker en overzichtelijker is. Maar is natuurlijk een persoonlijke manier van schrijven.
Nogmaals de TS is aan het leren, dus dan zie je een ! snel over het hoofd in het begin.
Ja, zo ken ik er nog meer... ;)
Dat het een persoonlijke manier van schrijven is en dat het jouw voorkeur heeft, daar kan ik me in vinden. Maar waar het om gaat is dat het absoluut niet fout of verkeerd is. Het een is niet beter dan het ander. En zoals het in de code stond was het dus gewoon goed.
jou manier kan voor een Boolean gebruikt worden maar dit is "Officieel" bedoeld om iets te vergelijken wat een bepaalde waarde moet hebben. dit wordt overigens zover als ik weet in elk programmeer taal gehanteerd. voorbeeldje van php.net
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// == is an operator which tests
// equality and returns a boolean
if ($action == "show_version") {
echo "The version is 1.23";
}
// this is not necessary...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...because this can be used with exactly the same meaning:
if ($show_separators) {
echo "<hr>\n";
}
?>
// == is an operator which tests
// equality and returns a boolean
if ($action == "show_version") {
echo "The version is 1.23";
}
// this is not necessary...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...because this can be used with exactly the same meaning:
if ($show_separators) {
echo "<hr>\n";
}
?>
Toevoeging op 18/10/2012 11:40:56:
Chris NVT op 18/10/2012 07:45:36:
Karin,
Het is niet aan te raden om 'het echte pad' op te geven wat je op regel 4 doet. Maar bijvoorbeeld alleen /images.
Tevens controleer je niets in je if statements, wat een beetje raar is.
Het is bijvoorbeeld
Dit pas je ook zo toe bij de if is_uploaded_file statement om te kijken of het gevult is. Je kunt ook empty gebruiken, beide doen in principe het zelfde alleen omgedraaid!
isset kijkt of er een waarde is, en empty kijkt of er geen waarde is. !isset kijkt of er geen waarde is, en !empty kijkt of er wel een waarde is.
Het is niet aan te raden om 'het echte pad' op te geven wat je op regel 4 doet. Maar bijvoorbeeld alleen /images.
Tevens controleer je niets in je if statements, wat een beetje raar is.
Code (php)
1
2
3
4
2
3
4
<?php
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])
//dit ook geen goede if statement*
?>
if (!move_uploaded_file($_FILES['afbeelding']['tmp_name'], $pad.$doelbestandsnaam.$extensie[0])
//dit ook geen goede if statement*
?>
Het is bijvoorbeeld
Dit pas je ook zo toe bij de if is_uploaded_file statement om te kijken of het gevult is. Je kunt ook empty gebruiken, beide doen in principe het zelfde alleen omgedraaid!
isset kijkt of er een waarde is, en empty kijkt of er geen waarde is. !isset kijkt of er geen waarde is, en !empty kijkt of er wel een waarde is.
Nomaals: dit script komt uit een studieboek. Ik heb het niet zelf verzonnen ;-)
Gewijzigd op 18/10/2012 11:56:41 door Karin Gijssen
Chris NVT op 18/10/2012 09:06:36:
Stel $_POST['test'] moet gevult zijn, en ik maak if ($_POST['test']). Nu schrijf ik dus een script dat er 'vanuit' gaat dat hij gevult moet zijn, zoniet gaat hij naar de else.
Maar wat als ik nu verwacht dat hij false is? Hoe kun jij nog zien wat het doel van je if statement is, wanneer je dit niet defineert?
Snapt u een beetje wat ik bedoel? :D
Stel $_POST['test'] moet gevult zijn, en ik maak if ($_POST['test']). Nu schrijf ik dus een script dat er 'vanuit' gaat dat hij gevult moet zijn, zoniet gaat hij naar de else.
Maar wat als ik nu verwacht dat hij false is? Hoe kun jij nog zien wat het doel van je if statement is, wanneer je dit niet defineert?
Snapt u een beetje wat ik bedoel? :D
Dat kan als volgt:
echter is dit niet de veiligste manier omdat je niet weet of hij ook daadwerkelijk gevuld is hiervoor kun je beter het volgende doen:
Karin Gijssen op 18/10/2012 11:39:31:
Waarom komt het script niet voorbij de eerste if?
Over welke if heb je het nu?
@Stefan: isset is voldoende hoor. Wel is het raadzaam om de waarde van de $_POST variabele te controleren.
Ozzie PHP op 18/10/2012 11:44:16:
Over welke if heb je het nu?
@Stefan: isset is voldoende hoor. Wel is het raadzaam om de waarde van de $_POST variabele te controleren.
Karin Gijssen op 18/10/2012 11:39:31:
Waarom komt het script niet voorbij de eerste if?
Over welke if heb je het nu?
@Stefan: isset is voldoende hoor. Wel is het raadzaam om de waarde van de $_POST variabele te controleren.
Ik bedoel de if (is_uploaded_file($_FILES['afbeelding']['tmp_name']))
Inmiddels heb ik bij de foutmelding de regel toegevoegd: echo $_FILES['afbeelding']['error']; Die geeft een twee terug. Dat zou betekenen dat de filesize groter is dan in het html document aangegeven. Dus ga ik daar nog eens naar kijken.