Проверка sfValidatorFile 'mime_type' не работает на производственном сервере - PullRequest
2 голосов
/ 21 декабря 2010

Я создал бэкэнд с парой моделей, одна из которых, Products, поддерживает загрузку изображений.Локально загрузка файла работает очень хорошо.Когда я выполнил развертывание, оно перестало работать: проверка формы не удалась из-за неправильного типа MIME (ошибка: «Недопустимый тип MIME (данные изображения JPEG, стандарт EXIF).) * для поля изображения, дажекогда я использую то же самое изображение JPG, которое я использовал для локального тестирования.

Я покажу вам код класса моей формы:

class ProductForm extends BaseProductForm
{
  public function configure()
  {
    ...

    /* Widgets */
    ...
    $this->widgetSchema['image_1'] = new sfWidgetFormInputFileEditable(array(
      'file_src' => '/'.basename(sfConfig::get('sf_upload_dir')).'/products/normal_'.$this->getObject()->getImage_1(),
      'is_image' => true,
      'edit_mode' => strlen($this->getObject()->getImage_1()) > 0,
      'delete_label' => 'remover el archivo actual',
      'template'  => '<div>%file%<br />%input%</div>'
    ));
    ...

    /* Validators */
    $this->validatorSchema['image_1'] = new sfValidatorFileImage(array(
      'required' => (! $this->getObject()->getImage_1()),
      'max_size' => '5252880',
      'path' => sfConfig::get('sf_upload_dir').'/products/original',
      'mime_types' => 'web_images',
      'min_width' =>  470,
      'max_width' => 99999,
      'min_height' =>  306,
      'max_height' => 99999,
      'validated_file_class' => 'sfResizedFile',   // This class creates the thumbnails
    ), array(
      'required' => 'Ten&eacute;s que seleccionar una imagen principal.',
      'max_size' => 'El tama&ntilde;o m&aacute;ximo es 5 MB',
      //'mime_types' => 'S&oacute;lo se permiten im&aacute;genes para web (jpg, png, gif)',
      'invalid_image' => '%value% no es un archivo de imagen.',
      'min_width' => 'El ancho de "%value%" es muy chico (mínimo %min_width% pixels).',
      'min_height' => 'El alto de "%value%" es muy chico (mínimo %min_height% pixels).',
    ));
    $this->validatorSchema['image_1_delete'] = new sfValidatorPass();
    ...
  }
  ...

sfValidatorFileImage простопользовательский класс валидатора, который расширяет sfValidatorFile проверками размера.Я попробовал с обычным классом sfValidatorFile на всякий случай, но ошибка сохраняется.Типы mime имеют какое-то отношение к конфигурации сервера?И почему он сломался на обычном веб-сервере?

Скорость ответа действительно ценится, так как это было необходимо развернуть сегодня.

Ответы [ 3 ]

1 голос
/ 13 августа 2012

Если ваша ОС - CentOS, функция mime_content_type возвращает, например, тип mime и дополнительную кодировку вместо 'image / jpeg', вы получите 'image / jpeg;charset = binary '

здесь есть решение:

отредактируйте sfValidatorFile.class.php и добавьте этот код после этой строки:

$mimeType = $this->getMimeType((string) $value['tmp_name'], (string) $value['type']);

вот код:

$mimeType = substr($mimeType, 0, strpos($mimeType, ';'));

1 голос
/ 21 декабря 2010

Единственное решение, которое я смог найти, - это комментировать первый элемент в массиве опции «mime_type_guessers» класса sfValidatorFile, который читает, в частности, «guessFromFileinfo».Вот код:

(lib / vendor / symfony / lib / validator / sfValidatorFile.class.php - строка 62 aprox.)

$this->addOption('mime_type_guessers', array(
  //array($this, 'guessFromFileinfo'),
  array($this, 'guessFromMimeContentType'),
  array($this, 'guessFromFileBinary'),
));

Также, копирование этого файла в lib /и комментирование строки в этом файле не работало, Symfony всегда использовал ту, что в lib / vendor / symfony / lib /, поэтому я сделал там изменение.

0 голосов
/ 21 декабря 2010

Также старайтесь не использовать коллекции мимов (web_images).вместо этого используйте массив:

$mime_types = array (
  'image/jpeg',
  'image/pjpeg',
  'image/png',
  'image/x-png',
  'image/gif',
);

$this->setValidator('filename', new sfValidatorFile(array(
  'mime_types' => $mime_types,
...
...