我已经构建了一个带有几个模型的后端,其中一个是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és que seleccionar una imagen principal.',
'max_size' => 'El tamaño máximo es 5 MB',
//'mime_types' => 'Sólo se permiten imá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服务器上破解?
真的很感激速度,因为今天需要部署。
答案 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,
...