[PHP] uploadscript werkt niet (goed)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Ik gebruik om te testen het onderstaande script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

$uploaddir = '/usr/local/apache2/htdocs/ranch/img/';
$uploadfile = $uploaddir. $_FILES['userfile']['name'];

copy($_FILES['userfile']['tmp_name'], $uploaddir.$_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 
    {
        echo "Gelukt...";
         // chmod ($uploadfile, 0777);
    }
else
    {
        echo "Nope...";
    }
?>

<form enctype="multipart/form-data" action="upload.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>


Het probleem is dat het script een plaatje (oid) blijkbaar maar voor de helft upload op de *n?x-server hier. Als ik het script lokaal op een WinXP machine draai, dan wordt wel het volledige bestand geupload.

De directory '/usr/local/apache2/htdocs/ranch/img/' is als 0777 ge-CHMOD

Mijns inziens behoord het script naar behoren te werken.

Serverinfo:
- PHP 4.3.0
- Apache 2.0.43


Heeft iemand hier enig idee? 'k Ben er al zo'n 2 weken mee bezig, heb al verscheidene scripts geprobeerd.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Waarom kopieer je hem eerst, en ga je hem vervolgens nog eens verplaatsen?

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!

  • sjroorda
  • Registratie: December 2001
  • Nu online
Is het plaatje groter dan de max toegestane upload size? Kan je vinden als je phpinfo() afdrukt (heet upload_max_filesize).

Kijk ook eens in $_FILES['userfile']['error'] voor een eventuele error...

Acties:
  • 0 Henk 'm!

  • Eijkb
  • Registratie: Februari 2003
  • Nu online

Eijkb

Zo.

Je doet eerst een copy en dan een move_uploaded_file. Dat is dubbelop. Normaliter, met zo´n IF statement doe je eerst een is_uploaded_file en dan een move of copy. Misschien komt het daardoor dat hij problemen geeft gezien het uploaden meestal effe duurt (vooral bij het uploaden via je internetverbinding waarvan de upload natuurlijk niet zo hoog is).

Snelle oplossing: Haal die hele regel met copy eens weg...

[ Voor 9% gewijzigd door Eijkb op 29-10-2003 09:54 ]

.


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Okay, die copyline heb ik weggehaald. MAar nog steeds doet het probleem zich voor.

De upload_max_filesize staat op 2MB dus kan geen problemen opleveren.

De $_FILES['userfile']['error'] resulteert in 0

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
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
$imageUpFile = $uploadedFile['tmp_name'];
$imageType = $uploadedFile['type'];
$imageName = $uploadedFile['name'];

//Open the uploaded pic (temp file)
if ($thePic = fopen ($imageUpFile, "rb"))
{
  //read temp file into var
   $savePic = fread($thePic, filesize($imageUpFile));

   //Open a new file in the correct directory using the name of the uploaded pic file
   if ($fileHandle = fopen("ftp://blaad:tak@ftp.server.nl/www/$imageName", "w"))
   {
       //Put data into just opened file pointer
       if (fwrite ($fileHandle, $savePic))
       {
         echo "file <b>$imageName</b> successfully written";
       }
       else
       {
         echo "file <b>$imageName</b> was NOT written";
      }
   }
   fclose ($fileHandle);
   fclose ($thePic);
}

Alternatieve code van php.net om dat copy gewoon niet altijd werkt, dit upload naar een ftp server, nooit problems mee gehad ;)

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • Eijkb
  • Registratie: Februari 2003
  • Nu online

Eijkb

Zo.

Is de target dir beschrijfbaar? Chmod die eens 777. En je hoeft niet de hele dir op te geven, je mag ook relatief werken vanuit het script waar je de functie aanroept. Dus indien de aanroep gebeurd in een file in de dir /ranch dan mag

$uploaddir = '/usr/local/apache2/htdocs/ranch/img/';

veranderd worden in

$uploaddir = 'img/';

en img moet je dan beschrijfbaar maken voor de eigenaar van apache (onder RH www-data). Oja, zet boven aan je script eens de regel error_reporting (E_ALL);. Dan krijg je alle errors te zien die PHP maar geeft. Let op: dat kunnen veel zijn (over ongedefinieerde variabelen enzo) maar misschien staat daar een error bij die hier iets mee te maken heeft.

Als je straks nog niet verder bent gekomen dan kan ik meer hulp bieden (zit nu op het werk en doe dit vanuit het hoofd), thuis heb ik werkende scripts. Zoek anders ook effe op de bekende PHP bronnen. Er is hier echt veel over te vinden.

[ Voor 17% gewijzigd door Eijkb op 29-10-2003 10:24 ]

.


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
@Eijkb: Zoals ik al aangaf is de directory al 0777 ge-CHMOD. Ik krijg ook geen foutmeldingen met de error_reporting op E_ALL.

Als de eigenaar van Apache geen rechten zou hebben op de img-dir dan kan er toch al helemaal niet geupload worden? Nu worden de bestanden maar voor een deel geupload.

Het veranderen van de $uploaddir naar 'img/' geeft ook geen verandering.

edit:

In mijn ogen heb ik reeds genoeg gezocht op de bekende PHP-bronnen. En kon daar niet vinden wat mijn probleem oploste. Het script dat ik gebruik zou in theorie moeten werken nl.


@djexplo: Bedankt voor het script, ik zal daar later eens naar kijken. Graag wil ik het op de 'normale' manier eerst proberen op te lossen :)

[ Voor 18% gewijzigd door TRON op 29-10-2003 10:28 ]

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

• Echo al je variabelen.
• Error repoting op E_ALL ?

Sundown Circus


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
@RedRose:
code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [userfile] => Array
        (
            [name] => 1066934473.gif
            [type] => image/gif
            [tmp_name] => /tmp/phpmpJ2Qr
            [error] => 0
            [size] => 144227
        )
)
Ik krijg ook geen foutmeldingen met de error_reporting op E_ALL.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

TRON schreef op 29 oktober 2003 @ 11:06:
@RedRose:
code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [userfile] => Array
        (
            [name] => 1066934473.gif
            [type] => image/gif
            [tmp_name] => /tmp/phpmpJ2Qr
            [error] => 0
            [size] => 144227
        )
)



[...]
Ok, dus hij komt binnen in de tmp-dir. Heeft het apache account rechten op de tmp dir?

edit: check ook deze note bij move_uploaded_file
Note: When safe mode is enabled, PHP checks whether the files or directories you are about to operate on have the same UID (owner) as the script that is being executed.
edit2: geeft move_uploaded_file zelf true of false terug? en lees dus wanneer dat gebeurt. ;)

[ Voor 38% gewijzigd door RedRose op 29-10-2003 11:12 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Safe-mode staat uit.

De /tmp-dir staat op 1776, dat lijkt me dus ook wel okay.

Als resultaat krijg ik 'Gelukt...' dus ik kan er dan vanuit gaan dat de move_uploaded_file TRUE is.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Het enige dat ik dan nog kan verzinnen is dat de file of ergens anders neer wordt gezet, of dat het pad+filename toch niet helemaal goed is. :?

Sundown Circus


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Dat is het nou juist, dat is allemaal wel goed. Het vage van dit alles is, dat een bestand maar voor de helft (??) wordt geupload. Bij een .GIF of .JPG zie je dan ook de helft van het plaatje goed en de andere helft is 'gescrambled' (zo ziet het eruit)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Krukar
  • Registratie: September 2001
  • Laatst online: 17-09 21:23
Zet eens een set_time_limit(0); bovenin je PHP.
Misschien staat de maximum execution time te laag ingestelt op die unix machine... ;)

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
@Websnake: Bedankt voor de tip! Maar helaas het mocht niet baten...

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Eijkb
  • Registratie: Februari 2003
  • Nu online

Eijkb

Zo.

Tja. Het wordt steeds vreemder en vreemder. Doe je verder ook geen GD bewerkingen op je files uitvoeren? Zal wel niet he. Zoiets zou je bestand kunnen vervormen. Maar dat een bestand maar half binnenkomt bij een goed werkende functie....

Kun je het script nog eens posten zoals het nu is?

.


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Check wat de maximale waardes zijn in de php ini op de server van:
post_max_size
upload_max_filesize

en eventueel zelfs:
memory_limit

Als een van bovenstaande vars kleiner is dan het plaatje, dan werkt je upload dus niet (helemaal).

NB. Probeer ook eens die enctype uit je form te halen.

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$is_uploaded = is_uploaded_file($_FILES['foto']['tmp_name']); 

 if ($is_uploaded == "1")
{ 
  
  $temp_name = $_FILES['foto']['tmp_name']; 
  $orig_name = $_FILES['foto']['name']; 
  $new_name = "/usr/local/psa/home/vhosts/***.nl/httpdocs/klaar/foto/$orig_name";

 //echo "$new_name\n<br>"; 
 
move_uploaded_file($temp_name,$new_name); 
//echo "File uploaded.\n<br>"; 

}


Probeer dit eens

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
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
<?php
set_time_limit(0); 
error_reporting ('E_ALL');
print_r ($_FILES);

// $uploaddir = '/usr/local/apache2/htdocs/ranch/img/';
$uploaddir = 'img/';
$uploadfile = $uploaddir. $_FILES['userfile']['name'];

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) 
    {
        echo "Gelukt...";
            chmod ($uploadfile, 0777);
    }
else
    {
        echo "Nope...";
    }

echo $_FILES['userfile']['error'];
?>


<form enctype="multipart/form-data" action="upload.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>



-edit 1-
@Tizzwat: Jouw script werkt ook niet.


-edit 2-
@slm:
post_max_size => 8MB
upload_max_filesize => 2<B

memory_limit => ?

[ Voor 51% gewijzigd door TRON op 29-10-2003 20:34 ]

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Zo te zien is je post en upload_max wel goed. Je memory limit moet er ook in staan. Als je phpinfo() doet en zoekt op memory_limit moet je het zo kunnen vinden. Als deze kleiner is dan bestand+andere formdata + script size + overige vars dan krijg je ook wel eens gekke dingen.

Als memory_limit voldoende is, zou je je httpd.conf moeten checken voor de waarden van LimitRequestBody en een evt. Timeout.

Heb je trouwens al geprobeerd je enctype="multipart etc" en je <input type="max_file_size"etc> weg te halen?

To study and not think is a waste. To think and not study is dangerous.


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
@slm: Heb ik nu ook geprobeerd, dat werkt ook niet.

Ik zal nog ff kijken naar memory_limit en LimitRequestBody en Timeout

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
De Timeout staat op 300, dus voldoet aan de eisen.

memory_limit en LimitRequestBody zijn niet te vinden. -edit- |:(


memory_limit => 8MB

LimitRequestBody is niet te vinden.

[ Voor 28% gewijzigd door TRON op 30-10-2003 09:23 ]

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Al geprobeerd over te gaan op PHP 4.3.3?

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Krukar
  • Registratie: September 2001
  • Laatst online: 17-09 21:23
Misschien een heel stom vraagje, maar heeft die unix machine nog genoeg schijfruimte :?

Verder is updaten van php misschien idd wel handig.

Ik gebruik hier ook een uploadscript, en dat werkt in ieder geval onder linux, solaris en windows, en het heeft ongeveer dezelfde structuur (mijne is wel 199 regels, maar ik doe er een hele hoop meer bewerkingen mee ;))

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Ja, er is genoeg schrijfruimte ;)

Als ik er echt niet uitkom zal ik zorgen dat er overgestapt gaat worden op 4.3.3. Volgens mij moet het met deze versie (4.3.0) ook gewoon werken icm Apache 2.0.4.3.

Is er iemand die mijn uploadscript even zou willen testen op een *n?x-server?

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Ik kan het vanavond testen op mijn FreeBSD bak. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Fijn :) tx!

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Ik wil graag een ieder bedanken die heeft meegedacht met dit probleem. Het probleem is nu opgelost.

Via deze bugreport http://bugs.php.net/bug.php?id=19263 ben ik erachter gekomen.
code:
1
2
3
4
<Files *.php>
    SetOutputFilter PHP
    SetInputFilter PHP
 </Files>

naar
code:
1
2
3
4
# <Files *.php>
#   SetOutputFilter PHP
#   SetInputFilter PHP
# </Files>


:X

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)

Pagina: 1