sfValidatorFile'mime_type'验证在生产服务器中不起作用

时间:2010-12-21 00:30:06

标签: php symfony1 symfony-1.4

我已经构建了一个带有几个模型的后端,其中一个是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类,但错误仍然存​​在。哑剧类型是否与服务器配置有关?为什么它会在普通的Web服务器上破解?

真的很感激速度,因为今天需要部署。

3 个答案:

答案 0 :(得分:1)

我能找到的唯一解决方案是在sfValidatorFile类的“mime_type_guessers”选项数组中注释第一项,具体来说就是“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 /中的那个,所以我在那里进行了更改。

答案 1 :(得分:1)

如果您的操作系统是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, ';'));

答案 2 :(得分:0)

还尝试不使用mimes集合(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,
...