Dienstag, 15. September 2009

MIME type problem mit Symfony's sfValidatorFile unter PHP 5.3.0

Wenn Sie die Symfony-Klasse sfValidatorFile in der Version 1.2.8 und älter, zusammen mit PHP 5.3.0 nutzen, werden Sie die Fehlermeldung:
"Invalid mime type (image/jpeg; charset=binary)"
erhalten. Hier ein Beispiel mit eine jpg-Datei. Das Problem trift aber auch auf andere mime types zu!

Der Grund für das Problem liegt nicht bei Symfony, sondern in eine Änderung in der PHP-Version 5.3.0 Die PHP-Funktion finfo_file liefert jetzt in der Version 5.3.0 nicht nur den mime type (z.B. "image/jpeg") sondern auch den character set, wie oben bereits in der Fehlermeldung gezeigt:
"image/jpeg; charset=binary"

Das Problem wird hier erläutert:
http://bugs.php.net/bug.php?id=48885
Hier wird deutlich erwähnt, dass es ein Feature und kein Bug ist!

Leider ist diese gravierende Änderung, die die Rückvärtskompatibilität beeinträchtigt, nicht in die Dokumentation eingeflossen:
http://php.net/manual/en/function.finfo-file.php

Entwickler bei ZEND haben den code in ihre lib nachgezogen, sodass es mit beiden Versionen klar kommt.

Bis Symfony nachgezogen hat, können Sie sich mit diesem work around selber helfen. In Ihre Form-Klasse, wo Sie sfValidatorFile nutzen, geben Sie einfach explizit die "neuen" mime types mit:

$this->validatorSchema['bild'] = new sfValidatorFile(array('mime_types' =>
array(
'image/jpeg; charset=binary',
'image/pjpeg; charset=binary',
'image/gif; charset=binary',
'image/png; charset=binary',
'image/x-png; charset=binary',
)));

Und wenn Sie wie ich, auch abwechselnd mit älteren PHP-Versionen arbeiten, geben Sie einfach beide formate mit:

$this->validatorSchema['bild'] = new sfValidatorFile(array('mime_types' =>
array(
'image/jpeg',
'image/pjpeg',
'image/gif',
'image/png',
'image/x-png',
'image/jpeg; charset=binary',
'image/pjpeg; charset=binary',
'image/gif; charset=binary',
'image/png; charset=binary',
'image/x-png; charset=binary',
)));

Viel Erfolg!

Kommentare:

  1. sfValidatorFile erwartet als ersten parameter ein options array also sollte der code folgender massen lauten:

    $this->validatorSchema['bild'] = new sfValidatorFile(array('mime_types' => ...

    AntwortenLöschen
  2. Oups!
    Ich bitte um Entschuldigung für diesen Ausrutcher!
    Danke für den Hinweis!
    Ich werde den Post ändern, sodass Niemandem in die Irre geführt wird.
    Mein produktiver Code sieht in der tat auch so aus, wie sie es sagen...
    $this->validatorSchema['large'] = new sfValidatorFile(array('required' => true,
    'path' => sfConfig::get('app_inseratbild_upload_dir'),
    'mime_types' => array(
    'image/jpeg',
    'image/pjpeg',
    'image/gif',
    'image/png',
    'image/x-png',
    'image/jpeg; charset=binary',
    'image/pjpeg; charset=binary',
    'image/gif; charset=binary',
    'image/png; charset=binary',
    'image/x-png; charset=binary',
    )));

    AntwortenLöschen