[PHP] File (images) uploaden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste GoT'ers,

Ik heb mijn probleem al voorgelegd aan andere mensen. Zij konden mij helaas niet de goede oplossing geven. Vandaar dat ik het graag hier wil voorleggen, hopelijk kan iemand mij een uitleg geven wat ik fout doe.

Wat ik aan het maken ben is een admin voor een photobook.
De opzet is als volgt:

Pagina 1 (werkt): Eerste pagina waar je aantal foto's opgeeft, naam van het album, naam van de folder die php moet aanmaken op de server.
Pagina 2 (werkt): PHP haalt de gegevens van pagina 1 op en post ze. PHP maakt het mapje aan op de server en checkt hoeveel foto's erin moeten en creert een form met aantal foto's + browse buttons.
Pagina 3: De foto's worden geupload en gegevens gepost.

Op de laatste pagina gaat het fout.

Error: "Je bestand kon niet geupload worden."

Pagina 3:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php 

$directory_nm = $_POST["directory_nm"];
echo " $directory_nm <br><hr>";

    // $foto is where file went on webserver
    // $foto_name is original file name
    // $foto_size is size in bytes
    // $foto_type is mime type e.g. image/gif
    
    $foto = $HTTP_POST_FILES['foto']['tmp_name'];
    $foto_name = $HTTP_POST_FILES['foto']['name']; 
    $foto_type = $HTTP_POST_FILES['foto']['type']; 
    $foto_size = $HTTP_POST_FILES['foto']['size']; 

    if (!IsSet($HTTP_POST_FILES['foto'])) 
    { 
        exit("Je hebt niets geupload !?"); 
    } 
    else
    {
        while (list($key,$value)= each ($foto)) 
        { 
        if ($value != "" && $value != "none" && !empty($value)) 
        { 
            move_uploaded_file($HTTP_POST_FILES['foto']['tmp_name'], '../images/pics/$directory_nm/'.$foto_name[$key]); 
            
            if  (!move_uploaded_file($HTTP_POST_FILES['foto']['tmp_name'], '../images/pics/$directory_nm/'.$foto_name[$key])) 
            { 
                echo "Je bestand kon niet geupload worden.<br><hr>"; 
            } else { 
                echo "Foto met de naam " . $foto_name[$key] . " is verzonden.<br>"; 
                echo "Foto type " . $foto_type[$key] . " is correct.<br>";
                echo "Foto size " . $foto_size[$key] . " is correct.<br>";
                echo "Temporary folder: " . $foto[$key] . " <br>";
                echo "[img]\"../images/pics/$directory_nm/$foto_name[$key]\"<br><hr[/img]"; 
            } 
        






} 
                 
} 

}
?> 


Bij voorbaat dank,

Ken

[ Voor 13% gewijzigd door Verwijderd op 24-11-2003 13:22 ]


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik zie 2x precies de zelfde regel; namelijk regels 26 en 28. Ik zou regel 26 weg halen, dat scheelt ten eerste een regel en ten tweede denk ik ook dat het daar mis gaat.
Je verplaatst (26) de temp-file, en daarna kijk je (28) of het verplaatsen van de temp-file lukt, maar die is dan al verplaatst volgens mij.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OkkE schreef op 24 november 2003 @ 13:39:
Ik zie 2x precies de zelfde regel; namelijk regels 26 en 28. Ik zou regel 26 weg halen, dat scheelt ten eerste een regel en ten tweede denk ik ook dat het daar mis gaat.
Je verplaatst (26) de temp-file, en daarna kijk je (28) of het verplaatsen van de temp-file lukt, maar die is dan al verplaatst volgens mij.
Hmm. Is inderdaad waar en logisch wat je hier zegt. Ik heb 26 eruit gehaald, helaas werkt het dan nog niet.


Regel 28 ...
PHP:
1
if  (!move_uploaded_file($HTTP_POST_FILES['foto']['tmp_name'], '../images/pics/$directory_nm/'.$foto_name[$key]))

Verplaats je met deze code het plaatje wel? Dit is toch alleen maar een 'check':
als ie verplaats dan dit, als ie niet verplaatst dan.....?

[ Voor 13% gewijzigd door Verwijderd op 24-11-2003 13:49 ]


Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 06:07

Snow_King

Konijn is stoer!

nee, _is_upload_file kijkt of de file is ge-upload, en move_uploaded_file verplaatst de file

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Verwijderd schreef op 24 november 2003 @ 13:48:
[...]


Hmm. Is inderdaad waar en logisch wat je hier zegt. Ik heb 26 eruit gehaald, helaas werkt het dan nog niet.


Regel 28 ...
PHP:
1
if  (!move_uploaded_file($HTTP_POST_FILES['foto']['tmp_name'], '../images/pics/$directory_nm/'.$foto_name[$key]))

Verplaats je met deze code het plaatje wel? Dit is toch alleen maar een 'check':
als ie verplaats dan dit, als ie niet verplaatst dan.....?
Jup de code word dan ook uitgevoerd.
Ik zie ook dat je eerst $_POST gebruikt, en daarna $HTTP_POST_FILES ipv $_FILES

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

move_uploaded_file() is een functie die iets doet en daarna TRUE of FALSE terug geeft.

in je if() check je, door het uitroepteken ervoor doet hij de if wanneer de functie FALSE geeft en doet hij else wanneer er TRUE uit komt. Aangezien je nu doet:
als move_uploaded_file() false is, doe dit .. anders doe het andere

__ Edit __

PHP:
1
if ($value != "" && $value != "none" && !empty($value))

Hier kan $value != "" && sowieso weg, aangezien dit in !epmty ook gechecked wordt. Of empty ook checked op 'none' weet ik niet zeker.

Verder check je alleen $value, maar nergens $key, terwijl je $key gebruikt als file name.. wat krijg je als je $key echo'ed?

[ Voor 36% gewijzigd door OkkE op 24-11-2003 13:56 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Snow_King schreef op 24 november 2003 @ 13:53:
nee, _is_upload_file kijkt of de file is ge-upload, en move_uploaded_file verplaatst de file
Oke, ik heb daarom van regel 16 (eerste post) dit gemaakt:
PHP:
1
    if (!is_uploaded_file($HTTP_POST_FILES['foto']))


Uitkomst:
Je hebt niets geupload !?


Edit: Het lijkt erop dat het bestand al niet eens in een temp map terecht komt?

[ Voor 13% gewijzigd door Verwijderd op 24-11-2003 14:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OkkE schreef op 24 november 2003 @ 13:53:
move_uploaded_file() is een functie die iets doet en daarna TRUE of FALSE terug geeft.

in je if() check je, door het uitroepteken ervoor doet hij de if wanneer de functie FALSE geeft en doet hij else wanneer er TRUE uit komt. Aangezien je nu doet:
als move_uploaded_file() false is, doe dit .. anders doe het andere

__ Edit __

PHP:
1
if ($value != "" && $value != "none" && !empty($value))

Hier kan $value != "" && sowieso weg, aangezien dit in !epmty ook gechecked wordt. Of empty ook checked op 'none' weet ik niet zeker.

Verder check je alleen $value, maar nergens $key, terwijl je $key gebruikt als file name.. wat krijg je als je $key echo'ed?
Ik krijg de juiste file naam...

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Laat het formulier ook eens zien dat je gebruikt om de boel te versturen (Heb je daar bijvoorbeeld wel content type bij gezet?)

Hmm.. Ik kijk nog even naar je source, en zie eigenlijk een heleboel rare dingen. In de ene helft ga je er van uit dat je een array hebt die je vervolgens in de foreach gebruikt, maar daarna ga je er weer van uit dat je gewoon 1 bestand geupload hebt. Probeer dat eerst even recht te trekken.


Probeer eens een print_r $_FILES te doen (of $HTTP_POST_FILES)

[ Voor 62% gewijzigd door Janoz op 24-11-2003 14:08 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Status:

Pagina 2:
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
30
31
32
33
<?php
    include ("../include/connect.php");

    if ($directory_nm=="" || $total=="" || $name=="")
    {
    echo "Please fill in all fields";
    exit;
    }
    else
    {
    $directory_nm = $_POST["directory_nm"];
    $total = $_POST["total"];
    $name = $_POST["name"];
    echo " $directory_nm ";
    echo " $total ";
    echo " $name ";

    $toevoegen = "INSERT INTO lsns_photos (id_album,name,folder,total) VALUES ('','$name','$directory_nm','$total')"; 
    mysql_query($toevoegen) or die (mysql_error());     
    
    mkdir("../images/pics/$directory_nm", 0777);

    echo "<form method=\"post\" action=\"photos_upload_2.php\" enctype=\"multipart/form-data\">"; 
    for( $i=0; $i< $total ; $i++) 
      { 
    echo "Foto $i:<input type=\"file\" name=\"foto[]\">";
      }
    echo "<input type='text' size=\"40\" class='form' name='directory_nm' readonly value='$directory_nm'>";    
    echo "<input type=\"submit\" value=\"uploaden\"></form>"; 

    }
    
?>


Pagina 3:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php 

$directory_nm = $_POST["directory_nm"];
echo " $directory_nm <br><hr>";

    // $foto is where file went on webserver
    // $foto_name is original file name
    // $foto_size is size in bytes
    // $foto_type is mime type e.g. image/gif
    
    $foto = $HTTP_POST_FILES['foto']['tmp_name'];
    $foto_name = $HTTP_POST_FILES['foto']['name']; 
    $foto_type = $HTTP_POST_FILES['foto']['type']; 
    $foto_size = $HTTP_POST_FILES['foto']['size']; 

    if (!is_uploaded_file($HTTP_POST_FILES['foto'])) 
    { 
        exit("Je hebt niets geupload !?"); 
    } 
    else
    {
        while (list($key,$value)= each ($foto)) 
        { 
        if ($value != "" && $value != "none" && !empty($value)) 
        { 
    
            if  (!move_uploaded_file($HTTP_POST_FILES['foto']['tmp_name'], '../images/pics/$directory_nm/'.$foto_name[$key])) 
            { 
                echo "<b>Je bestand kon niet geupload worden.</b><br>";
                echo "Foto met de naam " . $foto_name[$key] . " is niet verzonden.<br>"; 
                echo "Foto type " . $foto_type[$key] . " is correct.<br>";
                echo "Foto size " . $foto_size[$key] . " is correct.<br>";
                echo "Temporary folder: " . $foto[$key] . " <br>";
                echo "[img]\"../images/pics/$directory_nm/$foto_name[$key]\"<br><hr[/img]";
            } else { 
                echo "<b>Foto met de naam " . $foto_name[$key] . " is verzonden.</b><br>"; 
                echo "Foto type " . $foto_type[$key] . " is correct.<br>";
                echo "Foto size " . $foto_size[$key] . " is correct.<br>";
                echo "Temporary folder: " . $foto[$key] . " <br>";
                echo "[img]\"../images/pics/$directory_nm/$foto_name[$key]\"<br><hr[/img]"; 
            } 
        






} 
                 
} 

}
?> 


Uitkomst:
Je hebt niets geupload !?


Edit: Het lijkt erop dat het bestand al niet eens in een temp map terecht komt?

[ Voor 23% gewijzigd door Verwijderd op 24-11-2003 14:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien heeft het te maken met de array van foto[]'s. Werkt het met een (1) simpele foto wel? Dus niet een array foto[] met 1 element, maar met slechts 1 <input type=file name=foto> element? Dan zou je eventueel ook variabelenfoto0, foto1, foto2 etc. kunnen gebruiken in plaats van een array.

[ Voor 24% gewijzigd door Verwijderd op 24-11-2003 14:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op 24 november 2003 @ 14:05:
Laat het formulier ook eens zien dat je gebruikt om de boel te versturen (Heb je daar bijvoorbeeld wel content type bij gezet?)

Hmm.. Ik kijk nog even naar je source, en zie eigenlijk een heleboel rare dingen. In de ene helft ga je er van uit dat je een array hebt die je vervolgens in de foreach gebruikt, maar daarna ga je er weer van uit dat je gewoon 1 bestand geupload hebt. Probeer dat eerst even recht te trekken.


Probeer eens een print_r $_FILES te doen (of $HTTP_POST_FILES)
Oke, ga het nog even rustig uit zoeken.. Ik heb nu tmp_name laten geven dmv
PHP:
1
2
3
$foto = $HTTP_POST_FILES['foto']['tmp_name'];
echo "Je hebt niets geupload !?";
echo " $foto ";

Uitkomst: Je hebt niets geupload !? Array

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

En als je dat vervangt door:
PHP:
1
2
3
$foto = $HTTP_POST_FILES['foto'][0]['tmp_name'];
echo "Je hebt niets geupload !?";
echo " $foto ";
:?

Als je namelijk 1 foto upload heb je een array van foto (tmp naam, naam, size enz), upload je echter meerdere fotos, heb je een array van alle arrays met tmp naam enz.. :)

__ Edit __

Of moet het nou juist dit zijn. .. .. weet ik ook niet, moet je maar even testen.

PHP:
1
$foto = $HTTP_POST_FILES['foto']['tmp_name'][0];

[ Voor 46% gewijzigd door OkkE op 24-11-2003 14:21 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm.. Ben even opnieuw gaan bouwen en wat dingen weg gelaten:

Zo werkt het:

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
30
31
32
33
34
35
36
37
38
39
40
41
<?php 

$directory_nm = $_POST["directory_nm"];
echo " $directory_nm <br><hr>";

    // $foto is where file went on webserver
    // $foto_name is original file name
    // $foto_size is size in bytes
    // $foto_type is mime type e.g. image/gif
    
    $foto = $HTTP_POST_FILES['foto']['tmp_name'];
    $foto_name = $HTTP_POST_FILES['foto']['name']; 
    $foto_type = $HTTP_POST_FILES['foto']['type']; 
    $foto_size = $HTTP_POST_FILES['foto']['size']; 



    while (list($key,$value)= each ($foto)) 
      { 
        if ($value != "" && $value != "none" && !empty($value)) 
         { 
            if (copy ($value, "../images/pics/$directory_nm/".$foto_name[$key])) 
            { 
                echo "<b>Foto met de naam " . $foto_name[$key] . " is verzonden.</b><br>"; 
                echo "Foto type " . $foto_type[$key] . " is correct.<br>";
                echo "Foto size " . $foto_size[$key] . " is correct.<br>";
                echo "Temporary folder: " . $foto[$key] . " <br>";
                echo "[img]\"../images/pics/$directory_nm/$foto_name[$key]\"<br><hr[/img]"; 
            } 
                                 
         } 
      } 








?> 


Nu wil ik een error toevoegen als er niks geupload is... 1 browse vergeten bijvoorbeeld. Filesize is te groot, File is geen plaatje... etc...

[ Voor 39% gewijzigd door Verwijderd op 24-11-2003 14:39 ]


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Doet ie het nu, of krijg je geen error? Bedoel, komen de files nu wel in je map terecht? Want de error-msg eruit halen wil niet zeggen dat het dat automatisch wel werkt he. ;)

Error bericht erbij:

PHP:
1
2
3
4
5
6
7
8
if (copy ($value, "../images/pics/$directory_nm/".$foto_name[$key]))
{
echo "gelukt";
}
else
{
echo "er ging iets fout..";
}

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OkkE schreef op 24 november 2003 @ 14:41:
Doet ie het nu, of krijg je geen error? Bedoel, komen de files nu wel in je map terecht? Want de error-msg eruit halen wil niet zeggen dat het dat automatisch wel werkt he. ;)

Error bericht erbij:

PHP:
1
2
3
4
5
6
7
8
if (copy ($value, "../images/pics/$directory_nm/".$foto_name[$key]))
{
echo "gelukt";
}
else
{
echo "er ging iets fout..";
}
Werkt! De files komen in de folders en worden weergegeven op de website. :)

Ik wil nu nog wat errors toevoegen als het bestand geen image is, een file al op de server staat etc. Even kijken hoe dat moet .. _/-\o_

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Vergelijk die code nu eens met de code die je aan het begin had. Vervang de copy in je werkende code door move_uploaded_file (dan werkt de code nog steeds) en dan zie je precies waar je werkende code verschilt met je niet werkende code.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1