Paul: Uploadscript Probleme mit MIME-Typen

Hallo,

ich habe ein paar Probleme mit meinem Uploadscript.
Ich schaue nach dem Upload ob es sich um einen der von mir erlaubten Dateitypen handelt...

$type = $_FILES['file']['type'];

// eraubte Dateitypen
   if(($type != "application/pdf") &&
      ($type != "image/gif") &&
      ($type != "application/msword") &&
      ($type != "image/tiff") &&
      ($type != "image/jpeg") &&
      ($type != "application/zip") &&
      ($type != "application/mspowerpoint") &&
      ($type != "text/rtf") &&
      ($type != "text/plain") &&
      ($type != "application/msexcel") &&
      ($type != "image/psd")) {
      $err[] = "<b>Der Dateityp scheint nicht genemigt zu sein.<b>";
   }

Ich habe keine Probleme *.jpg - Bilder hoch zu laden. Bei meinem Bruder funktioniert es jedoch nicht. *.jpg, *.psd, *.zip kann er nicht hoch laden, wogegen *.doc, *.pdf funktioniert.

Sind nun meine MIME-Typ Angaben falsch? Ist es vom Browser abhaengig, oder warum funktioniert es bei meinem Bruder weder im IE noch im FF?

Bin fuer jede Hilfe Dankbar...

  • Paul
  1. $_FILES['userfile']['type']

    funktioniert nur wenn der Browser diese Information zur Verfügung stellt.

    siehe http://www.php.net/manual/de/features.file-upload.php#features.file-upload.post-method

    Mfg Jan

  2. Hallo,

    Ich habe keine Probleme *.jpg - Bilder hoch zu laden.

    JPGs musste du leider doppelt prüfen, nämlich einmal auf "image/jpg" und einmal auf "image/pjpeg", das von manchen Browsern verwendet wird.

    Viele Grüße!
    _Dirk

  3. Hello,

    Sind nun meine MIME-Typ Angaben falsch? Ist es vom Browser abhaengig, oder warum funktioniert es bei meinem Bruder weder im IE noch im FF?

    Browser können lügen.
    Und das scheint hier der Fall zu sein.

    _Überprüfe_ lieber den Dateityp, anstatt ihn zu glauben.

    Je nach Installationseinstellungen hat PHP eine fertige Funktion dafür

    mime_content_type() http://de2.php.net/manual/de/function.mime-content-type.php

    oder auch nicht.
    Wenn Du dann ein entsprechend eingerichtetes Linux hast, kanns Du die Funktion noch selber bauen:

    if(!function_exists('mime_content_type'))
    {
      function mime_content_type($filename)
      {
        $filepath = realpath($filename);
        $_mime = array();

    // Spaces werden maskiert, weil sie sonst trennen
        $filepath = str_replace(" ","\ ",$filepath);

    exec ("file -bi $filepath", $_mime, $error);

    if (($error) or (count($_mime) != 1)) return false;

    if (strpos($_mime[0], "can't stat") !== false)
        {
          $mime = "Typ unbekannt";
        }
        elseif (strpos($_mime[0], "can't read") !== false)
        {
          $mime = "Datei nicht lesbar";
        }
        elseif (strpos($_mime[0], "can't ") !== false)
        {
          $mime = "unbekannter Fehler";
        }
        else
        {
          $mime = trim($_mime[0]);
        }

    return $mime;
      }
    }

    Mit Hilfe dieser Funktion kannst Du den MIME-Type dann auf dem Server kontrollieren.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. jedoch muss ich dazu die Datei erst auf dem Server speichern, oder?

      Wuerde gerne bevor ich die Datei speicher ueberpruefen um was es sich da handelt...

      1. Hi,

        jedoch muss ich dazu die Datei erst auf dem Server speichern, oder?
        Wuerde gerne bevor ich die Datei speicher ueberpruefen um was es sich da handelt...

        Die Datei ist bereits auf dem Server gespeichert.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        http://www.schreinerei-waechter.de/
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      2. Hello,

        jedoch muss ich dazu die Datei erst auf dem Server speichern, oder?

        Wuerde gerne bevor ich die Datei speicher ueberpruefen um was es sich da handelt...

        HTTP ermöglichst beim Post das Mitsenden von Files im HTTP-Body.
        Die Daten der Datei weren dabei im Header des Bodyabschnittes übertragen.
        Der Apache speichert diese "Anhänge" nun in einem Temp-Dir und übergibt die Meta-Daten des Files an das Environment der PHP-Programm-Instanz, die sie dann an das Script weiterleiten in $_FILES

        Apache und PHP arbeiten hier so zusammen, dass die PHP-Instanz das File wieder aus dem Temp-Dir entfernt, wenn der Parser die Kontrolle zurückgibt (also das Script beendet/abgebrochen wurde).

        Wenn Du die Datei behalten willst, musst Du sie aus dem Temp-Dir in ein permanantes Dir kopieren.

        Die Scriptlaufzeit max_execution_time beginnt übrigens erst nach dem Ende des Uploads. Für diesen ist die Maximale Upload Zeit max_input_time zuständig.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau