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

相关推荐

  • PHP设计模式之命令模式

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

    2022年1月7日
    1.5K
  • 广东互联网医院监管对接_前置机FTP文件上传

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

    2021年5月26日
    1.9K
  • php向Postgresql中插入时间格式问题

    最近在对接互联网医院监管前置机时,向前置机Postgresql数据库插入数据时出现了一个问题,就是我在数据插入前置机前把时间用date(‘Y-m-d h:i:s&#82…

    2021年7月23日
    1.7K
  • php代码批量Zend Guard解密方法

    最近找到一套源码,想着测试一下功能,顺便学习一下他们的代码思想,结果所有的php文件都是乱码的,由于没有安装说明,只能自己摸索。打开源码,发现其中有些关键词Zend Guard,初…

    2021年12月18日
    5.9K
  • codeigniter发邮件sendmail报错

    最近将公司系统从Windows换成了Linux,大部分功能都能正常使用,唯独发送邮件通知功能时,出现了错误。通过var_dump($CI->email->print_d…

    2020年11月12日
    1.9K
  • 计算机网络协议总结(转载)

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

    2022年5月31日
    1.8K
  • 常见的Web攻击手段(转)

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

    2021年10月10日
    1.6K
  • 以太坊节点面面观:全节点与轻节点(转)

    收看本系列文章的读者,应该都对于区块链的基本原理和架构有些概念,如果没有,推荐您先去Google搜寻区块链、比特币、以太坊这些关键字了解一下。我们将在这些基础概念之上,来谈区块链的…

    2020年11月30日
    7.1K
  • JS定时触发—–新订单提醒展示效果并提示音效(转)

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

    前端 2022年6月28日
    2.1K
  • 单点登录SSO设计与实现(转)

    前言: 是时候了解一下SSO相关的知识了,本篇主要是概念篇,发现网上两篇不错的文章,简单整合了一下,原文链接:https://www.cnblogs.com/Java3y/p/10…

    2021年7月29日
    2.7K

发表回复

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