[php] Afbeelding wordt geupload in FireFox maar niet in IE

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Ik ben bezig om een simpele CMS in elkaar te draaien, waarbij het onder meer mogelijk is om foto's te uploaden. Gisteren ben ik er de hele dag mee bezig geweest, en aan het einde van de dag deed hij precies wat hij moest doen: afbeelding uploaden en de alt-tekst erbij. * TerraGuy blij, drie achterwaartse salto's enzo.

Aangezien hij voor nagenoeg iedereen te gebruiken moet zijn, open ik hetzelfde bestand in Internet Explorer (ik gebruik zelf FireFox) en wat krijgen we nu: de tekst uit het formulier wordt wel doorgevoerd maar de afbeelding wordt niet opgeslagen..

Om wat specifieker te zijn: als ik in FireFox een joekel van een bestand upload, is hij ff bezig met de verwerking en herlaadt de pagina daarna netjes met de nieuwe foto (afgezien van het cache-probleempje).
In IE is hij direct klaar als ik de submit-button aanklik, hoe groot de foto ook is, en er verschijnt geen nieuwe foto op de pagina, en ook niet op mijn harde schijf (dit kan ik direct controleren). Hij doet het gewoon niet dus.

Natuurlijk heb ik alles nog 10x doorgelezen, gezocht met Google & hier, maar niks te vinden wat de reden kan zijn voor deze flauwe weerbarstigheid van IE. Ik dacht dat PHP-code browseronafhankelijk was en dat PHP altijd dezelfde uitkomst zal geven, in elke browser, of is dat niet zo? Of zit er een fout in de form?

Afijn, de 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
// include van database
include("database.php");
$db = openDB();

// update de nieuwe fotonaam (alt-tekst) als er een nieuwe via 'post' is verstuurd
if($_POST["fotonaam1"]){
$fotonaam1 = $_POST["fotonaam1"];
$updatedb = mysql_query("UPDATE hoofdpagina SET afbeeldingboven =  '$fotonaam1'");
mysql_query($updatedb, $db); 
} 

// selecteer de alt-tekst uit de database
$result = mysql_query("SELECT afbeeldingboven FROM hoofdpagina"); 
$row = mysql_fetch_array($result); 
$afbeeldingalttekst1 = $row['afbeeldingboven'];
?>

<!-- Bij het indrukken van de 'submit-button' dezelfde pagina herladen -->
<form action="fototest3.php" method="post" enctype="multipart/form-data">
<img src="../afbeeldingen/winkel.jpg" alt="huidige foto" class="fotos" />
<br />
<br />
    Nieuwe foto versturen? Klik op bladeren en kies een nieuwe foto. <br />
    <input type="file" name="afbeelding1" /><br />
    De titel van de nieuwe foto:<br />
    <input type="text" name="fotonaam1" maxlength="80" size="90" value="<?php print $afbeeldingalttekst1; ?>" /><br />

<?php
// variabelen die voorkomen in de include een waarde meegeven
$afbeelding = "afbeelding1";
$afbeeldingnaam = "winkel.jpg";
$afbeeldingenplek = "../afbeeldingen/";
$hoogte = 200;
$breedte = 200;

// Als er een nieuwe foto is verstuurd en het is een jpg-afbeelding: verkleinen en naar de aangegeven directory verplaatsen
include("inc.losseafbeeldingenuploaden.php");
?>

<br />
    <input type="submit" value="Opslaan" /><br />(Bij het versturen van grote afbeeldingen kan het opslaan lang duren.)
</form>


..en de include die de afbeelding verwerkt (alleen relevante code):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// bekijk of er iets is geupload
if(isset($_FILES[$afbeelding]))
{

// bekijk of het een jpg-bestand is dat is geupload
if ($_FILES[$afbeelding]['type'] == "image/jpeg"){ 
    copy ($_FILES[$afbeelding]['tmp_name'], $afbeeldingenplek.$_FILES[$afbeelding]['name'])

// Gaat er iets mis? Sterf! Sterf, zeg ik je! 
    or die ("Er ging iets mis op de server."); 

// hele lap code die de afbeelding verwerkt, vorige afbeelding verwijdert en de nieuwe hernoemt naar de juiste naam

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 20-09 21:53
Heb je ook onderstaande checks uitgevoerd?
- Komt de upload aan in de temp directory
- gaat de copy actie van de temp naar de juiste locatie goed?

Je zal eerst moeten problemen om het probleem te gaan isoleren (waar treedt het precies op?). Pas dan kan ik hier iets zinnigs over zeggen.

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

code:
1
($_FILES[$afbeelding]['type'] == "image/jpeg")


Bovenstaande check al gedebugged?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
PHP heeft trouwens een speciale functie voor het afhandelen van file uploads. Tenzij je een specifeke reden hebt om copy() te gebruiken (ik kan er zo gauw geen bedenken want PHP verwijdert het bestand toch uit de temp directory nadat script executie is afgerond) zou ik de functie gebruiken die daarvoor bedoeld is: move_uploaded_file()

http://nl3.php.net/manual/en/function.move-uploaded-file.php

Verder zou ik even kijken met print_r() wat nou eigenlijk de inhoud van $_FILES is op het moment dat je het gaat afhandelen. Misschien dat je daar uit kan opmaken wat er niet goed gaat.

Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
pjonk schreef op maandag 04 december 2006 @ 12:03:
Heb je ook onderstaande checks uitgevoerd?
- Komt de upload aan in de temp directory
- gaat de copy actie van de temp naar de juiste locatie goed?

Je zal eerst moeten problemen om het probleem te gaan isoleren (waar treedt het precies op?). Pas dan kan ik hier iets zinnigs over zeggen.
Hmz, ik heb het technisch niet uitgevogeld. Redenerend nam aan dat als ik een foto van 5MB upload en die in één klik op de submit button al klaar is, er helemaal niets wordt geupload. Maar goed, de onderbuurman heeft een goed punt te pakken:
eek schreef op maandag 04 december 2006 @ 12:05:
code:
1
($_FILES[$afbeelding]['type'] == "image/jpeg")


Bovenstaande check al gedebugged?
Hier zit inderdaad het probleem. Als ik die check vervang door if(1 == 1) dan gaat het wel goed. Concluderend: het mime-type, in dit geval "image/jpeg" is geen functie van PHP maar een browserfunctie die niet goed ondersteund wordt door IE. Heb ik dat goed?

Dus ik moet een andere manier zien te vinden om te checken of het geuploade bestand een JPG is. Zijn hier veilige methodes voor, anders dan alles accepteren wat eindigt op .jpg?

@ CAIRATH: daar zal ik ook even naar kijken. Bedankt voor de tip!

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Er staat ook in de PHP manual dat je niet po die waarde moet rekenen, PHP controleert 'm niet.

Kijk eens naar getimagesize(), daar kan je het type ook mee achterhalen.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
TerraGuy schreef op maandag 04 december 2006 @ 12:23:
[...]
Dus ik moet een andere manier zien te vinden om te checken of het geuploade bestand een JPG is. Zijn hier veilige methodes voor, anders dan alles accepteren wat eindigt op .jpg?
Voor het checken van afbeeldingen kun je getimagesize() gebruiken. Dit is afaik de enige veilige methode, aangezien een mime-type ook alleen maar aangeeft wat de client naar de server verstuurt. Als ik kwaad in de zin heb kan ik ook malicious code het mime-type image/jpeg meegeven...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

TerraGuy schreef op maandag 04 december 2006 @ 12:23:
Hier zit inderdaad het probleem. Als ik die check vervang door if(1 == 1) dan gaat het wel goed. Concluderend: het mime-type, in dit geval "image/jpeg" is geen functie van PHP maar een browserfunctie die niet goed ondersteund wordt door IE. Heb ik dat goed?
Dat heb je ongeveer goed. Het is wel iets wat ondersteund wordt door IE, alleen elke browser heeft zijn eigen omschrijvingen van de mime-types. Natuurlijk wil het toeval, dat IE net wat meer van het gros afwijkt als de rest :Y)

Ik zou het inderdaad afdrukken om te kijken welke mime-type-omschrijvingen IE verstuurd, en die handmatig erbij in coderen. Dus niet meer keihard checken op "image/jpeg" maar een array bijhouden van geldige types, waar je bijvoorbeeld ook .bmp .png .gif en dergelijke in kan zetten.

Hier zijn overigens wel voorbeelden van te vinden op het internet :) Succes ermee. Ik heb op zich wel een lijst voor je met mime-types maar helaas is m'n webhoster neer dus die kan ik er helaas niet bijpakken. Mocht dat nog lukken dan post ik die wel voor je als ik het niet vergeet ;)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Als je de $_FILES gewoon uitleest, zie je wat voor mimetype IE hanteert, dit kan weleens afwijken, als je even googled kom je redelijk snel complete lijsten met MIME types uit waarop je vervolgens kan checken, voor jpg kan het volgens mij net zo goed image/JPG zijn.

Acties:
  • 0 Henk 'm!

  • falcon4ever
  • Registratie: Oktober 2001
  • Laatst online: 07-04-2021
dacht dat IE de jpeg als "image/pjpeg" verstuurde...

Acties:
  • 0 Henk 'm!

Verwijderd

falcon4ever schreef op maandag 04 december 2006 @ 14:23:
dacht dat IE de jpeg als "image/pjpeg" verstuurde...
Klopt. Ik had dit probleem laatst ook... ook met .png's is er een verschil (image/x-png en image/png). Handig is om onderaan je script phpinfo() aan te roepen dan zie je de verschillende types.

Acties:
  • 0 Henk 'm!

  • TerraGuy
  • Registratie: Februari 2001
  • Laatst online: 17-06-2023

TerraGuy

The weirdo with the beard

Topicstarter
Yup, nadat ik de check had omgebouwd met getimagesize() als graadmeter, was het probleem verholpen. Bedankt voor de tips!

@falcon4ever: wat een geweldige icon heb jij! :+

Iedereen kan gelijk hebben, allemaal tegelijk. Dat heb je met quantum.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

falcon4ever schreef op maandag 04 december 2006 @ 14:23:
dacht dat IE de jpeg als "image/pjpeg" verstuurde...
Niet altijd, maar vaak wel. Je moet er in elk geval wel op checken als je wil dat het uploaden van JPEG's in IE ook werkt. :)

'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

Ik vind dit nog steeds een opvallend iets in IE. Waarom ze het doen kan ik nog steeds niet zo 1 2 3 vinden op google. Het enige wat ik hier over weet dat de P voor progressive staat. Ik heb van andere gehoord dat het om beveileging ging, ik weet echt niet of ik deze personen moet vertrouwen :+

[ Voor 0% gewijzigd door Verwijderd op 04-12-2006 22:31 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik snap de ophef over het gedrag van IE en mimetypes niet zo. Als het gaat om het bepalen/controleren van wat voor een bestand je binnenkrijgt is een MIME header net zo waardeloos als een bestandsextensie: het geeft geen enkele garantie over de data die je binnenkrijgt. Om geüploadede data te controleren moet je altijd naar de data zelf kijken en niet zozeer naar de meegestuurde metadata. In de meeste gevallen volstaat het om die inhoud te controleren aan de hand van de paar bestandstypen die je wil toestaan.
De enige reden die ik zie waarom je MIME (of extensie for that matter) in acht zou willen nemen is dat je veel bestandstypen wil ondersteunen. Je kunt dan het controle-proces versnellen door alleen te checken of de inhoud overeenkomt met de verwachting aan de hand van het mimetype (of de extensie). Als het - zoals in dit topic - louter gaat om afbeeldingen is dat echter helemaal niet aan de orde en kun je veel beter de ingebouwde getImageSize() methode gebruiken...

Regeren is vooruitschuiven

Pagina: 1