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

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

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

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

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

这次的需求主要是,防止别人盗图,那防止盗图就得打上水印。突然想起阿里云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

(1)
ZeyuZeyu
上一篇 2021年2月22日
下一篇 2021年5月8日

相关推荐

  • 计算机网络协议总结(转载)

    一、OSI七层协议 1、物理层: 很久很久以前,那时候还没有现在的外星人超级电脑,或者华为的P30。比较调皮的小明想要把自己机器上写好的一些个人游戏心得(如何玩好王者农药)发给小红…

    2022年5月31日
    1.5K
  • Centos7 升级内核版本(转)

    1、查看当前内核版本 [root@localhost ~]# uname -r 3.10.0-327.el7.x86_64 [root@localhost ~]# uname -a…

    2022年3月13日
    1.5K
  • MySql基础知识总结-索引篇(转)

    一、MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。下面是MySQL的逻辑架构图: 1、第一层负责连接管理、授权认证、安全等等。 每个客户端的连…

    技术开发 2021年10月10日
    1.7K
  • Centos安装elasticsearch教程

    最近在部署一个项目是用 laravel开发,项目用到了了 elasticsearch,通过自己的搜索和学习能力不算很费力解决了。下面就整理一下安装elasticsearch教程,服…

    2020年11月26日
    1.6K
  • fiddler修改请求信息重新执行

    最近在做一个仿制功能开发时,碰到了这样一个场景:开发的系统需要在三方app里运行,并且在app里执行完后会产生一些数据,然后需要将这些数据保存起来。因为开发是在本地,本地的环境无法…

    2022年7月1日
    3.2K
  • VMware中CentOS 7设置文件夹共享的方法

    下午把虚拟机安装好了,但是还有一个不太给力的地方,就是本地代码每次编辑完总是要上传到服务器,之前windows的虚拟机是可以和物理机共享文件夹的,所以就尝试了一下通过文件夹共享来解…

    2021年8月16日
    2.0K
  • 广东省互联网医院接入——远程确认

    今天公司互联网医院接入终于走到了远程确认这一步了,因为一直是摸着石头过河,中间做了不少弯路,这里做个记录,希望也在摸索的同行如果看到能有一个参考。当然写这个的时候,还只是远程演示了…

    技术开发 2021年8月18日
    1.4K
  • 网站防DDOS攻击思路

    最近给一个客户搭的网站,受到DDOS攻击,因为源码是在网上找的,代码质量不忍直视,一个首页就有n条sql查询。虽然服务器配置用了8核8G内存,然后也加了阿里云全站加速(过滤了一些流…

    2022年9月5日
    2.8K
  • php后期静态绑定

    最近在跑一套系统时碰到一个头大的问题,laravel的队列任务(通过另一个原生系统读取数据库)在执行时,会出现数据库连接断开的问题,导致队列任务刚启动时可以正常运行,有一段时间没有…

    2022年4月18日
    1.5K
  • JS定时触发—–新订单提醒展示效果并提示音效(转)

    展示效果 php代码 版权声明:本文为lixing1359199697原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链…

    前端 2022年6月28日
    1.7K

发表回复

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