近期因项目需求在tp5.0框架下给图片添加水印并上传至阿里服务器,在此工作中消耗了不少时间。现对其中的流程和要点做个归纳。
1、因tp5.0原有框架未带图片处理库,因此需先要安装引入image图片操作库,
引入文件
use think\Image;
2、获取到上传图片,有必要时保存到项目服务器,以便后续操作。
3实例化对象 ,使用 $image->water( $log_url,\think\Image::WATER_CENTER,10)->save($dst_img)添加水印,并检查服务器中水印图片是否生成。
public function thumbwater()
{
$method = Request::instance()->method();
if ($method == "OPTIONS") {
return;
}
$file = $_FILES['file'];
$ext_arr = array(
'image' => array('mp4', 'mp3', 'jpeg', 'png', 'bmp'),
);
$max_size = 10 * 1024 * 1024;
//PHP上传失败
if (!empty($file['error'])) {
switch ($file['error']) {
case '1':
$error = '图片过大';
break;
case '2':
$error = '图片过大';
break;
case '3':
$error = '图片过大';
break;
case '4':
$error = '图片过大';
break;
case '6':
$error = '图片过大';
break;
case '7':
$error = '图片过大';
break;
case '8':
$error = '图片过大';
break;
case '999':
default:
$error = '图片过大';
}
return json(['code' => 1, 'msg' => $error]);
}
//原文件名
$file_name = $file['name'];
//服务器上临时文件名
$tmp_name = $file['tmp_name'];
//文件大小
$file_size = $file['size'];
//文件类型
$file_type = explode("/", $file['type']);
//检查文件大小
if ($file_size > $max_size) {
return json(['code' => 0, 'msg' => '图片过大']);
}
$type = $file_type[0]; //上传的是图片还是视频
$file_ext = $file_type[1]; //后缀
$filename = uniqid("lhj", false);
$uploadpath = ROOT_PATH . 'public/uploads/jc/';
if (!file_exists($uploadpath)) {
mkdir($uploadpath,0777);
}
$file_up = $uploadpath . $filename . "." . $file_ext;
$info = move_uploaded_file($file['tmp_name'], $file_up);
//添加水印
//实例化对象
$image = \think\Image::open($file_up);
// 给原图左上角添加水印并保存water_image.png
$fileName = 'public/uploads/' .time() .'aaaa'. '.' . $file_ext;
$dst_img = ROOT_PATH . $fileName; //存放路径
$log_url = ROOT_PATH .'./image/bwaterlogo.png';
$image->water( $log_url,\think\Image::WATER_CENTER,10)->save($dst_img);
//获取配置项,并赋值给对象$config
$config=config('aliyun_oss');
// try{
//实例化OSS
$ossClient=new \OSS\OssClient($config['KeyId'],$config['KeySecret'],$config['Endpoint']);
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'],$fileName, $dst_img);
// var_dump($result);exit;
$imgurl=str_replace("-internal","",$result['info']['url']);
$this->unlinkFile($file_up);
$this->unlinkFile($dst_img);
return json(["code" => 1, "msg" => '上传成功', 'data' => $imgurl]);
// }catch(OssException $o){
// return json(["code" => 0, "msg" => '上传失败']);
// }
}
4、水印添加成功后上传阿里服务器需注意传的参数。
5、删除多余的图片
//删除文件
public function unlinkFile($aimUrl)
{
if (file_exists($aimUrl)) {
unlink($aimUrl);
return true;
} else {
return false;
}
}