代码主体
我后台的框架使用的是laravel,所以这里使用了laravel自带的存储类
接收并存储代码
public function paste(Request $request){
// 存储的文件
$base64Str = $request->input('base64');
// 正则匹配数据
preg_match('/^(data:s*image/(w+);base64,)/', $base64Str, $res);
// 解析真正的图片字符串
$file = base64_decode(Str::after($base64Str, $res[1]));
// 存储的文件,指定了当前磁盘的根目录
$filePath = $this->fileName('/editormd/'.now()->year, $res[2]);
// 存储在当前磁盘中不存在的文件
Storage::disk('public')->put($filePath, $file);
return response()->json(['success'=>1, 'url'=>'/storage'.$filePath]);
}
步骤:
- 先从字符串提取出图片的格式。
- 再对剩下的字符串中的图片实体进行
base64_decode
解码 - 其中
Str::after($base64Str, $res[1])
是获取除去data:image/png;base64,
后的字符串,像这样iVBORw0KGgoAAAANSUhEUgAA...
Storage::disk
是laravel内置的存储方法,你可以使用file_put_contents
代替。$this->fileName
是生成随机的文件名,详情见附录。
附录:
// 使用随机字符串生成文件名
private function fileName($dir, $ext){
// 循环50次检查文件,知道发现不存在的文件为止
$start = 0;
do{
$fileName = $dir.'/'.Str::random(40).'.'.$ext;
if(!Storage::disk('public')->exists($fileName)){
break;
}else{
$start ++;
}
}while($start <= 50);
return $fileName;
}