[PHP] Image uploaden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers

Voor een klant van mij host ik een aantal websites bij TransIP.
Drie van die sites draaien op hun eerste virtuele hosting server en de andere 3 draaien op hun tweede virtuele hosting server.

Een paar dagen geleden kreeg ik foutmeldingen binnen dat het uploaden van foto's niet meer lukte, dus ik ben gaan debuggen.
Ik vond het opzich al vreemd dat het niet meer werkte, want ik heb de laatste maanden geen wijzigingen meer aangebracht in het script.

Om het uploaden van foto's te testen heb ik onderstaand test script in elkaar gezet:

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
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
    if( !is_uploaded_file( $_FILES['bestand']['tmp_name'] ) )
    {
        trigger_error( 'No uploaded file found' );
        exit();
    }
    
    $aSourceImageData = getimagesize( $_FILES['bestand']['tmp_name'] );
    
    $rSourceImage = imagecreatefromjpeg( $_FILES['bestand']['tmp_name'] );
    
    $rDestinationImage = imagecreatetruecolor( $aSourceImageData[0], $aSourceImageData[1] );
    
    imagecopy( $rDestinationImage, $rSourceImage, 0, 0, 0, 0, $aSourceImageData[0], $aSourceImageData[1] );
    
    imagejpeg( $rDestinationImage, dirname( __FILE__ ).'/'.$_FILES['bestand']['name'] );
}

?>

<form method="post" action="upload.php" enctype="multipart/form-data">
    <input type="file" name="bestand" />
    <input type="submit" />
</form>


En ik heb het volgende ontdekt:
Dit script werkt vlekkeloos op de 3 sites die op hun tweede virtuele server draaien, maar op alle sites die op hun eerste virtuele server draaien krijg ik de volgende melding:

Warning: imagejpeg(): Unable to access /sites/(domeinnaam)/www/test/nieuwbouw1.jpg in /sites/(domeinnaam)/www/test/upload.php on line 35

Warning: imagejpeg(): Invalid filename '/sites/(domeinnaam)/www/test/nieuwbouw1.jpg' in /sites/(domeinnaam)/www/test/upload.php on line 35

Voor de zekerheid heb ik dit script ook getest op een webserver van XS4all, mijn eigen webserver en op die van een vriend van mij. Ook hier werkt het zonder problemen.

Mijn conclusie is dus: het ligt aan de webserver.
Ik heb contact gehad met TransIP, maar die zeggen de laatste tijd geen wijzigingen aan hun configuratie te hebben gedaan, dus aan hun server kon het niet liggen.

Zie ik toch een fout in het script over het hoofd? Hebben jullie tips/ ervaringen/ Oplossingen?


edit:
owja, bij het testen heb ik de mappen een chmod 777 gegeven zodat de rechten geen probleem konden zijn.

Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 19:50

Gonadan

Admin Beeld & Geluid, Harde Waren
Als de code hetzelfde is gebleven dan móet het aan TransIP liggen.
Misschien dat ze na wat doordrammen toch toegeven dat er ergens een instelling of directory indeling is veranderd.

Of heb je zelf de code dan wel niet veranderd maar wel je directory structuur aangepast? :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Die "unable to access" melding doet me vermoeden dat je geen rechten hebt op die directory of op het bestand vanuit PHP/Apache. Dat kan aan een aantal dingen liggen, maar als je alles goed gechmod hebt, dan verdenk ik je host ervan safe mode aangezet te hebben. :)

'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!

Verwijderd

Topicstarter
Gonadan schreef op woensdag 05 april 2006 @ 16:31:
Als de code hetzelfde is gebleven dan móet het aan TransIP liggen.
Misschien dat ze na wat doordrammen toch toegeven dat er ergens een instelling of directory indeling is veranderd.

Of heb je zelf de code dan wel niet veranderd maar wel je directory structuur aangepast? :)
Ook al hebben ze de directory indeling veranderd, ik maak gebruik van de dirname() functie om de huidige directory te bepalen. Dus als ze de directory indeling gewijzigd hebben, zou het script automagisch de doel directory moeten aanpassen.
-NMe- schreef op woensdag 05 april 2006 @ 16:43:
Die "unable to access" melding doet me vermoeden dat je geen rechten hebt op die directory of op het bestand vanuit PHP/Apache. Dat kan aan een aantal dingen liggen, maar als je alles goed gechmod hebt, dan verdenk ik je host ervan safe mode aangezet te hebben. :)
Ik heb de map gechmod naar 777, zodat het rechten probleem uit de weg geruimd is.
De safe mode staat aan op de servers van TransIP, zoweel op virt1 als op virt2.
Maar het script werkt dus wel op virt2 en niet op virt1.

Ik heb nog wat verder zitten zoeken en een verschil wat ik heb ontdekt is dat virt2 (dus waar het wel werkt) met PHP 4.4.0 werkt en virt1 met 4.4.1.

Ik heb al in de changelog van PHP zitten neuzen, maar kan geen bugfixes vinden over de functies die ik gebruik, dus het lijkt me dat het daar ook niet in kan zitten.

Acties:
  • 0 Henk 'm!

  • BreeeZe
  • Registratie: Februari 2000
  • Laatst online: 19-09 13:42

BreeeZe

Devt

Hebben ze toevallig 'safe mode' op de tweede server aangezet :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Breerze

De safe-mode stond al aan op beide servers.

Acties:
  • 0 Henk 'm!

  • ZroBioNe
  • Registratie: Augustus 2001
  • Niet online
Vergelijk de instellingen uit phpinfo(); eens, daarin zal wel wat staan over safedir ofzo.. ff opzoeken

Je moet ff kijken of je script niet probeert buiten de open_basedir() te gaan, dit mag namelijk niet.
code:
1
2
3
4
; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.

[ Voor 67% gewijzigd door ZroBioNe op 06-04-2006 12:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb eindelijk weer even tijd gehad om verder te speuren naar een oplossing. Ditmaal met succes.

Het ging om een bekende bug in PHP 4.4.1 (hun eerste virtuele server draait nog op deze versie)
http://bugs.php.net/bug.php?id=35071

De tweede virtuele server is wel al geupdate naar 4.4.2 en bevat deze bug dus niet.

Ik heb het probleem opgelost door eerst het bestand aan te maken zonder inhoud, d.m.v:
PHP:
1
2
3
$oFile = fopen( dirname( __FILE__ ) . '/' . $sFileName, 'x' );
fwrite( $oFile, '' );
fclose( $oFile );


Het bestand bestaat nu wel en imageJpeg() kun nu wel de foto wegschrijven. :Y)

De werkende versie van het test script (voor de liefhebbers)
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

if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
    if( !is_uploaded_file( $_FILES['bestand']['tmp_name'] ) )
    {
        trigger_error( 'No uploaded file found' );
        exit();
    }
    
    $aSourceImageData = getimagesize( $_FILES['bestand']['tmp_name'] );
    
    // Remove the evil spaces and qoutes to prevent injection.
    $sFileName = str_replace( ' ', '_', $_FILES['bestand']['name'] );
    $sFileName = str_replace( '"', '', $sFileName );
    $sFileName = str_replace( "'", "", $sFileName );
    
    $rSourceImage = imagecreatefromjpeg( $_FILES['bestand']['tmp_name'] );
    
    $rDestinationImage = imagecreatetruecolor( $aSourceImageData[0], $aSourceImageData[1] );
    
    imagecopy( $rDestinationImage, $rSourceImage, 0, 0, 0, 0, $aSourceImageData[0], $aSourceImageData[1] );
    $oFile = fopen( dirname( __FILE__ ) . '/' . $sFileName, 'x' );
    fwrite( $oFile, '' );
    fclose( $oFile );
    imagejpeg( $rDestinationImage, dirname( __FILE__ ) . '/' . $sFileName );
}

?>
<form method="post" action="upload.php" enctype="multipart/form-data">
    <input type="file" name="bestand" />
    <input type="submit" />
</form>
Pagina: 1