2016-11-07 68 views
0

我有这样的形式输入:的Yii:验证的base64图像模型

<?= $form->field($model, 'imageFile', ['inputOptions' => ['id' => 'Imageupload']])->hiddenInput()->label(false) ?> 

的fieldd cointains图片为Base64字符串是这样的:

data:image/png;base64,iVBORw0K... 

我的模型验证规则包含此声明:

public function rules() { 
     return [ 
      [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'], 
     ]; 
    } 

但似乎这不适用于base64字符串。 有没有一种方法来验证它在模型中,还是我必须在控制器中生成一个真实的图像,然后用不同的php函数验证它?

回答

1

验证规则无法按预期工作,因为您的字段类型不是类型file,而且您还将图像数据手动存储为base64编码的字符串。现在要解决您的问题,您可以通过使用下面给出的PHP代码手动检查文件类型。

$model->imageFile = "/9j/4AAQSkZJRgABAQEASABIA..."; 

$mimetype = getImageMimeType($model->imageFile); 

echo $mimetype; 

function getBytesFromHexString($hexdata) { 
    for ($count = 0; $count < strlen($hexdata); $count += 2) 
     $bytes[] = chr(hexdec(substr($hexdata, $count, 2))); 

    return implode($bytes); 
} 

function getImageMimeType($imageString) { 
    $imagedata = base64_decode($imageString); 
    $imagemimetypes = array(
     "jpeg" => "FFD8", 
     "png" => "89504E470D0A1A0A", 
     "gif" => "474946", 
     "bmp" => "424D", 
     "tiff" => "4949", 
     "tiff" => "4D4D" 
    ); 

    foreach ($imagemimetypes as $mime => $hexbytes) { 
     $bytes = getBytesFromHexString($hexbytes); 
     if (substr($imagedata, 0, strlen($bytes)) == $bytes) 
      return $mime; 
    } 

    return NULL; 
}