2016-11-07 62 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; 
}