以下功能主要用于前端将图片Base64加密后,后端将接收到的文件流转换成图片存储到服务器上,其实也完全可以不存储原始图片文件,而保存文件流本身。但后者不是本篇讨论内容,以下是该功能源码。
PHP源码:
- function saveBase64Image($base64_image_content,$image_path){
- if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
- //图片后缀
- $type = $result[2];
- if($type=='jpeg'){
- $type='jpg';
- }
- //保存位置--图片名
- $image_name=date('His').str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT).".".$type;
- //$image_path = '/static/upload/quanzi/'.$memberid.'/image/';文件路径格式
- $image_url = $image_path.$image_name;
- if(!is_dir(ROOT_PATH.$image_path)){
- mkdir(ROOT_PATH.$image_path,0755,true);
- }
- //解码
- $decode=base64_decode(str_replace($result[1], '', $base64_image_content));
- if (file_put_contents(ROOT_PATH.$image_url, $decode)){
- $data['code']='0';
- $data['imageName']=$image_name;
- $data['image_url']=$image_url;
- $data['type']=$type;
- $data['msg']='保存成功!';
- }else{
- $data['code']='1';
- $data['imgageName']='';
- $data['image_url']='';
- $data['type']='';
- $data['msg']='图片保存失败!';
- }
- }else{
- $data['code']='1';
- $data['imgageName']='';
- $data['image_url']='';
- $data['type']='';
- $data['msg']='base64图片格式有误!';
- }
- return $data;
- }
文件上传是项目中常用的功能,所以上述分享只是其中一个轮子,不见得适用所有情况,根据自己需要选择吧。不过这个上传用起来还是蛮爽的。波波测试一个4.18M的图片(现在手机拍照一般都比较大),通过前端的压缩和转换后仅剩58K,清晰度基本上没有失真。对于用户而言也丝毫感觉不出来图片上传的延迟。用户体验度是最高的。建议收藏下。
前端图片压缩可以用html5ImgCompress.min.js。具体用法可自行百度。