Phil: Image-Upload, jpeg will nicht, warum?

Huhu!
Ich habe ein kleines Problem, ich habe folgendes Uploadscript

<?php
if(!isset($_FILES['picurl'])) {
   ?>
   <html>
   <head>
   <title>TITEL</title>
   </script>
   </head>

<body>
   <center><h3>Bild hochladen</h3></center>
   <p>
   Hier kannst du ein News-Bild hochladen. Bitte achte darauf, dass das Bild die optimale Größe von 181 Pixeln Breite und 138 Pixeln Höhe besitzt.<br />
   Als Dateitypen sind jg(e)g, gif und png erlaubt.
   </p>
   <form action="uploadpic.php" enctype="multipart/form-data" method="post">
   <input type="hidden" name="max_file_size" value="1232896">
   <input type="file" name="picurl" size="30" accept="image/*"><p>
   <input type="submit" value="hochladen">
   </p>
   </form>
   </body>
   </html>
   <?
} else {
   if($_FILES['picurl']['type']!="image/jpeg" && $_FILES['picurl']['type']!="image/gif" && $_FILES['picurl']['type']!="image/png") {
      die("Ausgewählte Datei ist keine gültige Bilddatei<br><a href="uploadpic.php">zurück</a>");
   } elseif($_FILES['picurl']['size']>1232896) {
      die("Bild ist zu groß (>1 MB), bitte verkleinern<br><a href="uploadpic.php">zurück</a>");
   } elseif(file_exists("newsimages/".$_FILES['picurl']['name'])) {
      echo '<b>Dateiupload nicht möglich: Datei "'.$_FILES['picurl']['name'].'" schon vorhanden!</b><br><a href="uploadpic.php" target="fenster">zurück</a>';
   } else {
      if($hoch=move_uploaded_file($_FILES['picurl']['tmp_name'], "newsimages/".$_FILES['picurl']['name'])) {
         echo 'Bild hochgeladen!';
      } else {
         echo $_FILES['picurl']['error'];
      }
   }
}
?>

und das funktioniert auch wunderbar, nur der Upload von jpg-Dateien funzt nicht. Es kommt immer die Meldung, dass das keine gültige Bilddatei sei.

Aber der mime-type von jpg ist doch "image/jpeg", oder?

CU
Phil

  1. Hallo!

    Aber der mime-type von jpg ist doch "image/jpeg", oder?

    Nein! Er lautet image/pjpeg.

    Das hättest Du aber auch raus finden können, in dem Du Dir den Inhalt von $_FILES['picurl']['type'], nach einem Upload einer JPD-Datei, angeschaut hättest.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Moin Moin !

      Aber der mime-type von jpg ist doch "image/jpeg", oder?

      Nein! Er lautet image/pjpeg.

      Einspruch: http://www.iana.org/assignments/media-types/image/ sagt: image/jpeg und nennt RFC2045 und RFC2046.

      IANA ist *verbindlich*.

      In RFC2045, Abschnitt 4.2. "Image Media Type":

      A media type of "image" indicates that the body contains an image.
         The subtype names the specific image format.  These names are not
         case sensitive. An initial subtype is "jpeg" for the JPEG format
         using JFIF encoding [JPEG].

      Das hättest Du aber auch raus finden können, in dem Du Dir den Inhalt von $_FILES['picurl']['type'], nach einem Upload einer JPD-Datei, angeschaut hättest.

      Das sagt nur aus, was Dein Browser als MIME-Type für *.jp[e]g benutzt. image/pjpeg soll wohl sowas wie "progressive jpeg" sein. Ich hab das schon an verschiedenen Stellen gesehen, anscheinend verdreht irgendeine Software die MIME-Types in einigen Browsern. Technisch ist es jedoch irrelevant, ob ein JPEG progressiv codiert ist oder nicht, diese Tatsache sollte im JPEG-Header stehen und braucht nicht durch einen eigenen, nicht registrierten MIME-Type gekennzeichnet werden.

      Ein frisch installiertes System sollte image/jpeg benutzen, nicht image/pjpeg.

      Alexander

      --
      Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
      1. Hallo!

        Einspruch: http://www.iana.org/assignments/media-types/image/ sagt: image/jpeg und nennt RFC2045 und RFC2046.

        Was http://www.iana.org/assignments/media-types/image/ schreibt, interessiert so, als ob in China ein Reissack umfällt.

        Es wird nun mal "image/pjpeg" geliefert und fertig! Was bringt es, wenn RFCyxz "image/jpeg" sagt, aber "image/pjpeg" geliefert wird.

        IMHO liefert mein Grafikprogramm auch keine progressives JPEG.

        Dann muß eben eine ODER-Abfrage eingebaut werden, für pjpeg oder jpeg.

        Ein frisch installiertes System sollte image/jpeg benutzen, nicht image/pjpeg.

        Kann ich von dem User erwarten, daß ein frisches System installiert hat?

        MfG, André Laugks

        --
        L-Andre @ gmx.de
        1. hi,

          Einspruch: http://www.iana.org/assignments/media-types/image/ sagt: image/jpeg und nennt RFC2045 und RFC2046.
          Was http://www.iana.org/assignments/media-types/image/ schreibt, interessiert so, als ob in China ein Reissack umfällt.

          im gegenteil, dass was _du_ sagtest,

          Aber der mime-type von jpg ist doch "image/jpeg", oder?
          Nein! Er lautet image/pjpeg.

          sollte unter möglichst vielen reissäcken vergraben werden.

          es mag sein, dass in der praxis andere werte auftauchen - daraus jedoch die aussage

          Nein! Er lautet image/pjpeg.

          herzuleiten, ist absurd.

          gruss,
          wahsaga

          1. Hallo!

            es mag sein, dass in der praxis andere werte auftauchen - daraus jedoch die aussage

            Na also, und was zählt nun? Was interessiert, was irgendwo geschrieben steht, wenn es in der Praxis nicht anwendbar ist.

            Phil hat sich noch nicht gemeldet, also scheint es jetzt wohl zu funktionieren.

            MfG, André Laugks

          2. Hallo!

            image/pjpeg.

            ich wie schon gesagt, dann muß halt nach image/pjpeg oder image/jpeg getragt werden und zusätzlich für die Sicherheit noch mit GetImageSize(), wie schon Sven schrieb.

            MfG, André Laugks

  2. Moin!

    if($_FILES['picurl']['type']!="image/jpeg" && $_FILES['picurl']['type']!="image/gif" && $_FILES['picurl']['type']!="image/png") {
          die("Ausgewählte Datei ist keine gültige Bilddatei<br><a href="uploadpic.php">zurück</a>");

    Du verläßt dich auf die Userangabe, es würde sich um eine Grafikdatei handeln! Sowas ist grob fahrlässig, denn es ist problemlos möglich, schädliche Programme ebenso als Bild hichzuladen.

    Wenn du prüfen willst, ob die gesendeten Bytes des Uploads ein gültiges Grafikformat sind, ignoriere die MIME-Angabe (die basiert idR auf der Dateiendung, nicht auf einer Formatprüfung), sondern nutze die Möglichkeiten von getimagesize().

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|