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

相关推荐

  • JS定时触发—–新订单提醒展示效果并提示音效(转)

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

    前端 2022年6月28日
    1.7K
  • php后期静态绑定

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

    2022年4月18日
    1.5K
  • 香港阿里云Windows服务器省钱方法

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

    2020年11月11日
    1.6K
  • window配置Vue2开发环境

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

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

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

    2020年12月19日
    2.0K
  • docker的备份和迁移

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

    2020年11月17日
    1.5K
  • 打破壁垒:使用 PHP 和 Nginx 在本地开发 OpenAI API

    最近在开发一个OpenAI的产品,但是由于众所周知的原因, OpenAI API 有 IP 限制,使得在本地开发变得困难。开始我的想法是,把代码放服务器上去跑,可是这样一来,要修改…

    2023年4月10日
    4.5K
  • php 创建BTC、LTC、ETH助记词、私钥和地址 使用示例(转)

    项目依赖: bitcoin-php bitcoin的php实现库,用于创建助记词和生成私钥 (此库需要运行在64位的php7.0+上) ethereum-util&nbs…

    区块链 2022年8月4日
    4.6K
  • 广东互联网医院监管对接_前置机FTP文件上传

    最近在广东省互联网医院监管对接过程中,有些文件需要同步到前置机上,我这里用到的解决方案是通过ftp上传文件功能实现的,这里记录一下一些遇到的问题。 1.安装,配置ftp服务器软件 …

    2021年5月26日
    1.6K
  • php实现助记词转TRX,ETH 私钥和钱包地址

    TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的功能需要依赖其他环境来实现表示不能忍,毕竟php是世界上最好的语言。【狗头】 一、知识准备 要实现助记词转T…

    2022年8月4日
    7.8K

发表回复

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