因为laravel对header头部作了处理,很多原生图片生成的写法,在laravel都不适用了,需要换种写法
以下这是原生php的写法,在普通php文件中,和tp框架中都可以正常输出验证码
session_start();
$tatted_code=dechex(mt_rand(0,15));
for($i=0;$i<3;$i++){
$tatted_code.=dechex((mt_rand(0,15)));
}
$_SESSION['code']=$tatted_code;
$width=70;
$height=25;
$img=imagecreatetruecolor($width, $height);
$_white=imagecolorallocate($img,236,251,208);
imagefill($img,0,0,$_white);
$bg=imagecolorallocate($img,204,204,204);
imagerectangle($img,0,0,$width-1,$height-1,$bg);
for($i=0;$i<strlen($_SESSION['code']);$i++){
imagestring($img,mt_rand(3,5),$i*$width/4+mt_rand(1,10),mt_rand(1,$height/2),$_SESSION['code'][$i],
imagecolorallocate($img,mt_rand(0,100),mt_rand(50,150),mt_rand(100,200)));
}
//输出图像
header('Content-Type:image/png');
imagepng($img);
imagedestroy($img);
以上的写法,在laravel中是不适用的,会导致出现一大堆的乱码,原因是laravel对header进行了处理。
以下代码,是laravel5.2中的写法,其他版本也类似
Route::get('verify',function(){
ob_clean();
ob_start();
session_start();
$tatted_code=dechex(mt_rand(0,15));
for($i=0;$i<3;$i++){
$tatted_code.=dechex((mt_rand(0,15)));
}
$_SESSION['code']=$tatted_code;
$width = 70;
$height = 25;
$img = imagecreatetruecolor($width, $height);
$_white = imagecolorallocate($img,236,251,208);
imagefill($img,0,0,$_white);
$bg = imagecolorallocate($img,204,204,204);
imagerectangle($img,0,0,$width-1,$height-1,$bg);
for($i=0;$i<strlen($_SESSION['code']);$i++){
imagestring($img,mt_rand(3,5),$i*$width/4+mt_rand(1,10),mt_rand(1,$height/2),$_SESSION['code'][$i],
imagecolorallocate($img,mt_rand(0,100),mt_rand(50,150),mt_rand(100,200)));
}
imagepng($img);
imagedestroy($img);
$content = ob_get_clean();
return response($content)->header('Content-Type','image/png');
});
网友评论