阿里云OSS图片上传与加水印签名访问

最近公司的一个系统有一个需求,因为公司的产品有一些特殊性,经常有可能会被同行盗图,所以需要将所有的产品图片加水印展示。但是还有一个需求,内部人员可能需要查看原图,所以,这个就有点奇葩了,本来这个需求从技术上来将也不是很难,把所有的图片复制一份,然后加上水印,之后的图片都保存两份,一份有水印,一份无水印,然后分别访问不同的图片url。如果这是一个还在开发的系统,这完全没问题。

但问题是,这个系统是已经开发完了,只是在维护的系统。里面涉及的接口很多,一个一个改很费时。其次,图片文件就有8个多G,就服务器那小水管带宽,要拿下来加了水印后,再上传上去,估计好几天都搞不完。还有一点就是祖传屎山勿动。

这时我突然想到所有的接口,在返回图片链接时都用了一个生成完整路径的方法,如果能把这个方法做个改造,能解决问题岂不美哉。

这次的需求主要是,防止别人盗图,那防止盗图就得打上水印。突然想起阿里云OSS能在链接里加参数就能加水印,裁剪,控制图片大小。例如下链接:

https://image-demo-oss-zhangjiakou.oss-cn-zhangjiakou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_300,h_300/watermark,type_d3F5LXplbmhlaQ,size_30,text_SGVsbG8gV29ybGQ,color_FFFFFF,shadow_50,t_100,g_se,x_10,y_10
图片处理5

水印的问题解决了,那防盗图的问题怎么解决呢?如果只是通过链接来添加水印,那盗图者修改链接就可以去掉水印,那加的水印就是掩耳盗铃。想起有些大的网站的图片链接都有一串参数,而且改掉其中部分参数,链接就失效了,所以招了OSS的文档,其中有个方法是链接签名。ok,问题解决,方案可行。

一、创建OSS Bucket

首先添加一个bucket,设置一个和项目相关的名字,地域的话选和服务器一个地方的区域,这样的话可以内网传数据,速度快而且免流量费。因为产品图经常要访问,我这里用的是标准存储。因为要防止盗图,所以文件肯定不能随便访问,因此读写权限的话选私有。

阿里云OSS图片上传与加水印签名访问

然后进入刚刚创建的bucket添加一个管理权限的子用户

阿里云OSS图片上传与加水印签名访问
阿里云OSS图片上传与加水印签名访问
用户管理
阿里云OSS图片上传与加水印签名访问
这里勾选编程访问
阿里云OSS图片上传与加水印签名访问
管理用户权限,给用户添加上oss相关的权限
阿里云OSS图片上传与加水印签名访问
创建 AccessKey 和 accessKeySecret 对接接口时要用到

二、图片上传到OSS

这里就不赘述过程了,直接上代码

工具类,主要是实现图片上传和生成图片查看链接两个方法,图片链接生成时顺带添加上水印和控制图片大小,因为运营上传的图片又是很大,导致用户打开产品列表时很慢。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
ini_set("display_errors", "on");

//引入阿里云的OSS sdk
require_once 'aliyun-oss-php-sdk-master/autoload.php';

USE OSSOssClient;
USE OSSCoreOssException;

/**
 * 阿里云oss上传
 * 
 * @author Administrator
 *
 */
class AliYunUpload_libraty
{
	private $accessKeyId;
	private $accessKeySecret;
	private $endpoint;
	private $bucket;
	
	public function __construct()
	{
		$this->accessKeyId = '';
		$this->accessKeySecret = '';
		
		// Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint="http://oss-cn-hangzhou.aliyuncs.com";
		$this->endpoint = 'oss-cn-hongkong.aliyuncs.com';
		// 存储空间名称
		$this->bucket = 'taoyaogu-test';
	}
	
	//$oss_path  oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录    
	//$file_path  由本地文件绝对路径加文件名包括后缀组成,例如/users/local/myfile.txt
	public function upload_file($oss_path, $file_path)
	{
		try {
			$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
			$result = $ossClient->uploadFile($this->bucket, $oss_path, $file_path);//$result['info']['url'] 返回上传成功的oss文件地址
			$arr = array(
					'oss_file' =>$result['info']['url'],
					'local_path' => $file_path
			);
			return $arr;
		} catch (OssException $e) {
			log_for_debug('文件上传失败:' . $e->getErrorCode() . ':' . $e->getErrorMessage() . "未上传的文件名 " . $file_path,'img_oss_up');
			return false;
		}
	}
	
	//$oss_path  oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录    
	public function img_view($oss_path)
	{
		try {
			$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
			// 生成一个带图片处理参数的签名的URL,有效期是3600秒,可以直接使用浏览器访问。
			$timeout = 3600;
			$options = array(
                            //配置图片最大大小和水印内容
			    OssClient::OSS_PROCESS => "image/resize,m_lfit,h_600,w_1000/watermark,text_5reY6I2v6LC3,fill_1,size_60,rotate_330,color_FFFFFF,t_20"
			);
			$signedUrl = $ossClient->signUrl($this->bucket, $oss_path, $timeout, "GET", $options);

			return $signedUrl;
		} catch (OssException $e) {
			log_for_debug('文件链接签名失败:' . $e->getErrorCode() . ':' . $e->getErrorMessage() . "未上传的文件名 " . $oss_path,'img_oss_up');//自己系统的保存错误日志的方法
			return false;
		}
	}
}

然后在自己的业务逻辑里调用这两个方法即可。这里主要参考了OSS文档的如下几篇文章:
PHP简单上传:https://help.aliyun.com/document_detail/88473.html
生成带图片处理参数的文件签名URL:https://help.aliyun.com/document_detail/47735.htm
图片水印:https://help.aliyun.com/document_detail/44957.html
URL-safe Baes64编码工具:https://simplycalc.com/base64url-encode.php

提示:OSS还有很多玩法,这里用到了其中几个接口。更多参考文档即可。

三、原有服务器图片文件同步到OSS

因为我们服务器用的是centos,所以不能像windows一样,安装一个 ossbrowser 像网盘一下咔咔往Bucket里传。阿里云官方文档介绍的OSS常用工具汇总:https://www.alibabacloud.com/help/zh/doc-detail/44075.htm

我这里选择用的是ossfs Bucket挂载工具 。 用于将OSS的Bucket挂载到Linux系统的本地文件系统中,挂载后可通过本地文件系统操作OSS上的Object,实现数据的访问和共享。

	下载源文件
	wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm
	
	安装
	sudo yum install ossfs_1.80.6_centos7.0_x86_64.rpm
	
	配置账号访问信息
	echo bucket-test:LTAIbZcdVCmQ****:MOk8x0y9hxQ31coh7A5e2MZEUz**** > /etc/passwd-ossfs
        chmod 640 /etc/passwd-ossfs
	
	将Bucket挂载到指定目录。
	mkdir /tmp/ossfs
        这里挂载时注意用内网节点,可以提升传输速度(如果你的服务器也是阿里云的,且节点在一个地方)
	ossfs taoyaogu-img /tmp/ossfs -o url=http://oss-cn-hongkong-internal.aliyuncs.com
	
	如果您不希望继续挂载此Bucket,您可以将其卸载。
	fusermount -u /tmp/ossfs

传了数据后,如果需要管理文件,可以在本地电脑安装一个 ossbrowser ,非常方便讲文件移动,复制,预览重命名什么的(在网页管理文件时无法做到,不知道是不是我没有找到)。

阿里云OSS图片上传与加水印签名访问
最后放一张效果图

原创文章,作者:Zeyu,如若转载,请注明出处:https://jinzhijun.cn/develop/346

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注