阿里云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日

相关推荐

  • 网站防DDOS攻击思路

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

    2022年9月5日
    2.6K
  • 使用 Laravel 开发 API 时的前置准备(转)

    一、前言 使用 Laravel 有一段时间了,虽然公司项目使用的都是 Thinkphp 框架,但我个人还是比较偏好 Laravel,今天来总结我平时进行开发前的一些准备工作,如果有…

    2022年7月15日
    3.3K
  • PHP设计模式之命令模式

    命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者。那么,这个模式解决…

    2022年1月7日
    1.2K
  • docker的备份和迁移

    1.查看容器 2.容器保存为镜像 php是容器名称 myphp是新的镜像名称 此镜像的内容就是你当前容器的内容,接下来你可以用此镜像再次运行新的容器 然后查询镜像,看一下结果 3.…

    2020年11月17日
    1.4K
  • 常见的Web攻击手段(转)

    午饭期间,读者小李与我闲聊,谈到上周去面试的过程。经典的高开低走,面试初期答得还可以,但是到后面却不尽人意。其中有个面试问题引起了我的注意,面试官当时问小李:你知道有哪几种常见的&…

    2021年10月10日
    1.2K
  • 阿里云SLB(负载均衡)访问远程端口

    最近公司在搞互联网医院三级等保的问题,然后广东卫生健康委办公室的接入通知里有一段话,说是用于互联网医院运行的服务器不少于2套(这里的单位是套),我们不知道这里的意思是指,服务器要有…

    2020年12月19日
    2.0K
  • window配置Vue2开发环境

    最近找到一套互联网医院的源码,前端技术栈用的是vue,于是想着把vue开发环境搭起来,在网上找了一点资料,现在总结记录一下,方便以后查阅。 一、介绍 Vue (读音 /v…

    2020年10月17日
    1.5K
  • 香港阿里云Windows服务器省钱方法

    最近把因为香港阿里云服务器要续费了,因为之前购买的时候服务器上还部署了其他的java系统,当时对Linux操作不熟,所以操作系统选的是Windows的系统,但是阿里云香港的服务器需…

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

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

    2022年7月1日
    3.0K
  • 记一次生产环境救火-20210716

    今天起了个早,早早来到公司,本来吃完早餐,泡好咖啡,在工位上气定神闲的刷刷昨天的财经信息,准备开启今天的工作。想起昨天微信群里有人反映系统,系统加载较慢,于是打开阿里云后台,准备看…

    2021年7月16日
    1.2K

发表回复

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