ThinkPHP6接收图片base64进行文件上传。
解决场景: 前端生成一个canvas图片后,传给后端是一串图片的base64字符串,常规的文件上传无法获取到这个文件。
于是,将base64保存到临时文件夹后,再转成一个thinkphp6上传文件类的对象,模拟上传文件。
$name = 'file';
$this->file = Request::file($name);
if (empty($this->file)) { $str = Request::post($name); $result = img_base64_2_binary($str, public_path('temp')); $result !== false && $this->file = new \think\file\UploadedFile($result, basename($result)); }
if (!function_exists('img_base64_2_binary')) {
function img_base64_2_binary(string $str, string $save_path = '') { $result = false; $pregInfo = preg_match('/^(data:\s*image\/(\w+);base64,)/', $str, $photoInfo); if ($pregInfo !== false) { $clearBase64HeadWithPhoto = str_replace(array($photoInfo[1], ' '), array('', '+'), $str); $photoFileSource = base64_decode($clearBase64HeadWithPhoto); $result = $photoFileSource;
if ($save_path) { $filePath = $save_path . rand(100, 999) . uniqid() . '.' . $photoInfo[2]; file_put_contents($filePath, $result); return $filePath; }
} return $result; } }
|