[PHP]Files op type checken in foreach lus.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Hallo allemaal,

Ik ben bezig een scriptje te schrijven waarbij er informatie in een database wordt gezet en er ook maximaal 5 foto's (jpg) kunnen worden ge-upload. Ik wil natuurlijk wel checken of deze foto's van het formaat jpg zijn, en later misschien ook nog wel checken of ze niet te groot zijn. Ik heb daarvoor de volgende functie gebouwd, alleen doetie het niet:

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
<?php
function get_errors_project() {
    global $HTTP_POST_FILES;
    $res = array();
    foreach ($HTTP_POST_FILES as $image=>$name) {
        if (isset($image)) {
            if ($image['size'] != 0) {
                $browser = getbrowser();
                if ($browser === TRUE) {
                    if ($image['type'] != 'image/jpeg') {
                        $res[] = 'De file '.$name.' is niet van het type jpg.';
                    }
                } else {
                    if ($image['type'] != 'image/pjpeg') {
                        $res[] = 'De file '.$name.' is niet van het type jpg.';
                    }
                }
            }
        }
    }           
            
    return $res;
}
?>


Dat het niet helemaal klopt, snap ik zelf ook wel. Ik heb alleen geen idee hoe ik het wel kloppend kan maken :) Alle hulp is welkom!

[ Voor 32% gewijzigd door Eswip op 06-08-2005 20:35 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

en.. wat doet hij precies niet? Begin eens met het toevoegen van wat `else` statements zodat je in ieder geval de flow van je applicatie kunt zien :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Gebruik eens $_FILES ipv dat antieke $HTTP_POST_FILES :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Spider.007 schreef op zaterdag 06 augustus 2005 @ 20:18:
en.. wat doet hij precies niet? Begin eens met het toevoegen van wat `else` statements zodat je in ieder geval de flow van je applicatie kunt zien :)
Het check alleen op fouten.. Als alles dus ok is (je vult een file in van type jpg) dan is $res leeg.. en dus geen error. Maar als ik nu bv een txt file wil uploaden, geeft hij ook geen error aan..

En verder wil (bij mij) $_FILES in een functie nog wel eens probs opleveren :/


EDIT
Ik heb ff wat elsjes er tussen geplakt... Hier gaat het fout:
if ($image['size'] != 0) {
En dat had ik ook wel verwacht.. :)

EDIT 2
Zonder een lus zou het dus zoiets moeten worden
$HTTP_POST_FILES['name']['size'] != 0

Maar $HTTP_POST_FILES['$name']['size'] zal niet gaan werken ben ik bang :x

[ Voor 30% gewijzigd door Eswip op 06-08-2005 20:35 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Eswip schreef op zaterdag 06 augustus 2005 @ 20:22:
[...]

EDIT
Ik heb ff wat elsjes er tussen geplakt... Hier gaat het fout:
if ($image['size'] != 0) {
En dat had ik ook wel verwacht.. :)
Controleer dan eens wat wel de waarde is van die variabele?
EDIT 2
Zonder een lus zou het dus zoiets moeten worden
$HTTP_POST_FILES['name']['size'] != 0

Maar $HTTP_POST_FILES['$name']['size'] zal niet gaan werken ben ik bang :x
Maar dit wel:
PHP:
1
$HTTP_POST_FILES[$name]['size']
misschien is een cursusje PHP geen slecht idee? :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Spider.007 schreef op zaterdag 06 augustus 2005 @ 20:56:
[...]
Controleer dan eens wat wel de waarde is van die variabele?
[...]

Maar dit wel:
PHP:
1
$HTTP_POST_FILES[$name]['size']
misschien is een cursusje PHP geen slecht idee? :)
Mwa, ik kan nog wel redelijk php, weet alleen nog weinig af van de $_FILE... maar geloof niet echt dat ik een total noob ben ;)

Anyway, zo werkt hij nog niet:

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
25
26
27
28
29
function get_errors_project() {
    global $HTTP_POST_FILES;
    $res = array();
    foreach ($HTTP_POST_FILES as $image=>$name) {
        if (isset($image)) {
            if ($image[$name]['size'] != 0) {
                $browser = getbrowser();
                if ($browser === TRUE) {
                    if ($image[$name]['type'] != 'image/jpeg') {
                        $res[] = 'De file '.$name.' is niet van het type jpg.';
                    } else {
                        $res[] = 'Alles is ok!';
                    }
                } else {
                    if ($image[$name]['type'] != 'image/pjpeg') {
                        $res[] = 'De file '.$name.' is niet van het type jpg.';
                    } else {
                        $res[] = 'Alles is ok!';
                    }
                }
            } else {
                $res[] = 'Image size is niet groter dan 0, namelijk '.$image[$name]['size'];
            }
        } else {
            $res[] = 'Geen image geset';
        }
    }                   
    return $res;
}


Hij komt nog steeds bij het zelfde uit.. dit is de uitkomst van $res:

Image size is niet groter dan 0, namelijk

hij heeft dus geen waarde.. :/


EDIT:

Tis gelukt met wat hulp van een vriend.. damn, dat ik daar zelf niet op ben gekomen :P

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function get_errors_project() {
    $res = array();
    for ($i = 1; $i <= 5; $i++) {
        if (isset($_FILES['pic'.$i])) {
            $v = $_FILES['pic'.$i];
            if ($v['size'] > 0) {
                $browser = getbrowser();
                if ($browser == TRUE) {
                    if ($v['type'] != 'image/jpeg') {
                        $res[] = 'De file '.$i.' is niet van het type jpg.';
                    }
                } else {
                    if ($v['type'] != 'image/pjpeg') {
                        $res[] = 'De file '.$i.' is niet van het type jpg.';
                    }
                }
            }
        }
    }                   
    return $res;
}

[ Voor 88% gewijzigd door Eswip op 06-08-2005 22:17 ]


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
Het lag 'm aan die if ($browser === TRUE) zeker (3x === ipv 2x :P)

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Mastermind schreef op zaterdag 06 augustus 2005 @ 23:29:
Het lag 'm aan die if ($browser === TRUE) zeker (3x === ipv 2x :P)
Nee, want in de else van die if doet hij precies hetzelfde :P.

Waarom doe je dat eigenlijk Eswip?

Overigens is een === een type safe (?) check in php.

dus

code:
1
2
3
4
5
6
7
true == true     => waar
true == 1        => waar     
true == 'a'      => waar

true === true    => waar
true === 1       => onwaar
true === 'a'     => onwaar

[ Voor 14% gewijzigd door eamelink op 06-08-2005 23:53 ]


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
eamelink schreef op zaterdag 06 augustus 2005 @ 23:51:
[...]


Nee, want in de else van die if doet hij precies hetzelfde :P.

Waarom doe je dat eigenlijk Eswip?

Overigens is een === een type safe (?) check in php.

dus

code:
1
2
3
4
5
6
7
true == true     => waar
true == 1        => waar     
true == 'a'      => waar

true === true    => waar
true === 1       => onwaar
true === 'a'     => onwaar
Als het IE is, moet de $_FILE['type'] pjpeg zijn, in een andere browser (firefox bv) moet het jpg zijn.. daarom check ik welke browser je gebruikt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Eswip schreef op zaterdag 06 augustus 2005 @ 20:22:
En verder wil (bij mij) $_FILES in een functie nog wel eens probs opleveren :/
Dat lijkt me heel erg sterk, aangezien $_FILES een superglobal is (overal en altijd aanspreekbaar), terwijl $HTTP_POST_FILES een gewone global is, die je in elke functie eerst expliciet als global moet aangeven. Juist $HTTP_POST_FILES zou dus vaag moeten werken in functies. ;)
Eswip schreef op zondag 07 augustus 2005 @ 02:35:
Als het IE is, moet de $_FILE['type'] pjpeg zijn, in een andere browser (firefox bv) moet het jpg zijn.. daarom check ik welke browser je gebruikt.
Daar heb je de browser toch niet voor nodig? Je kan wel beslissingen maken op basis van de browser, maar wat als bijvoorbeeld IE7 een eind maakt aan het verschil tussen image/jpeg en image/pjpeg? Kun jij je code weer aan gaan passen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Eswip schreef op zondag 07 augustus 2005 @ 02:35:
Als het IE is, moet de $_FILE['type'] pjpeg zijn, in een andere browser (firefox bv) moet het jpg zijn.. daarom check ik welke browser je gebruikt.
Aha, dat had ik niet gezien :X

Overigens zou ik niet deze methode gebruiken om te kijken of een plaatje echt een plaatje is, want je moet de clients browser natuurlijk niet zomaar geloven :P

Met getimagesize kan je GD laten bepalen of en zoja wat voor type plaatje iets is :)

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
-NMe- schreef op zondag 07 augustus 2005 @ 02:51:
Daar heb je de browser toch niet voor nodig? Je kan wel beslissingen maken op basis van de browser, maar wat als bijvoorbeeld IE7 een eind maakt aan het verschil tussen image/jpeg en image/pjpeg? Kun jij je code weer aan gaan passen. ;)
Hoe kan ik het dan zo maken dat je met alle browsers (of iig firefox en IE) kan uploaden? Misschien gewoon getimagesize functie gebruiken ja.. kijk daar vanavond nog wel ff na, nu eerst werken :P

Acties:
  • 0 Henk 'm!

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Wissel dit:
PHP:
1
foreach ($HTTP_POST_FILES as $image=>$name) {

eens om met dit:
PHP:
1
foreach ($HTTP_POST_FILES as $name=>$image) {

de eerste is de key, de tweede de inhoud van het element met die key

Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Okee, op naar de volgende fout.. :)

Ik heb het nu zo gemaakt dat je zelf kan aangeven hoeveel foto's je wil uploaden, zo veel invul velden verschijnen er dan ook. Alles werkt, alleen het uploaden van de foto's niet :)

de upload functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function upload_project_image() {
    $res = TRUE;
    for($i=1; $i<=$_POST['images']; $i++) {
        if (isset($_FILES['pic'.$i]) && $_FILES['pic'.$i]['size'] > 0) {
            if (file_exists(PROJECTDIR.$_POST['name'.$i].'.jpg')) {
                unlink(PROJECTDIR.$_POST['name'.$i].'.jpg');
            }
            if (!move_uploaded_file($_FILES['pic'.$i]['tmp_name'], PROJECTDIR.$_POST['name'.$i].'.jpg')) 
                $res = FALSE;
        }
    }
    return $res;
}

$_POST['image'] staat dus in hoeveel foto's je wil uploaden, dus hoeveel velden er zijn. Hij wordt zo aangeropen:

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

if (isset($_POST['formsubmit'])) {
    $errors = get_errors_project();
    if (count($errors) == 0) {
        $upload = upload_project_image();
        if ($upload === TRUE) {
            $database->query('INSERT INTO projects (name, password, projectname, date) VALUES ("'.$_POST['name'].'", "'.md5($_POST['pass1']).'", "'.$_POST['projectname'].'", '.time().') ');
            $id = $database->insertid();
            for($i=1; $i<=$_POST['todolist']; $i++) {
                $database->query('INSERT INTO todo (id, projectid, name, date) VALUES ("NULL", '.$id.', "'.$_POST['todo'.$i].'", '.time().') ');
            }
            ?>Project is toegevoegd.<?
        } else {
            ?>Het project is niet toegevoegd. De files konden niet ge-uplaod worden.<?
        }
    } else {
        print_projectaddform($errors);
    }
} else {
    print_projectaddform();
}

?>


Hij geeft gewoon aan dat het project is toegevoegd. Alles staat netjes in de db, maar de file is gewoon niet ge-upload.. De dit heeft wel juiste CHMOD rechten...


Anyone?


*****EDIT****

Fout is ontdekt... $_FILES is dus geen super global, dus moest nog ff gegloballed worden...

[ Voor 17% gewijzigd door Eswip op 07-08-2005 22:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

global $_FILES;

maar goed, dat wist je al ;)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
$_FILES is zeker wel een super global. Check de manual maar eens.
This is a 'superglobal', or automatic global, variable. This simply means that it is available in all scopes throughout a script. You don't need to do a global $_FILES; to access it within functions or methods, as you do with $HTTP_POST_FILES.

[ Voor 3% gewijzigd door Michali op 07-08-2005 23:54 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Eswip
  • Registratie: April 2005
  • Laatst online: 23-06-2024
Michali schreef op zondag 07 augustus 2005 @ 23:54:
$_FILES is zeker wel een super global. Check de manual maar eens.


[...]
Toen ik heb globalde werkte hij wel ineens, daarvoor niet.. erg appart dan :/

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Doe eens een var_dump() op $_FILES in die functie dan. Ben wel benieuwd wat daar de uitkomst van is.

Noushka's Magnificent Dream | Unity

Pagina: 1