函数计算-触发OSS来处理图片加水印和大小裁剪

阿里云在4月26日推出Function Compute(函数计算)后,很多客户踊跃申请试用,基于这个产品的目前的试用场景,会汇总多个场景逐步从浅入深来完成一系列主题讲解。

 

业务场景描述

在Web应用中,有很多在类型,其中针对有一种是针对电商、图片处理网站中当客户上传到OSS的图片进行大小裁剪或者批量加上防盗水印,通常的做法是搭建一个在线服务器并部署WEB应用来进行处理,程序需要按照一定规则来定时来触发事件,这样的情况下,会有3个明显的工作需要额外来考虑:

1、需要搭建Web应用服务器(不管有没有图片处理,空置率会比较高)

2、需要编写相关OSS代码来处理这块事情(需要专门维护一套运行处理代码)

3、需要考虑图片处理的及时性如何保障(要考虑并发和定时器的执行方法)

以上问题,我们仅仅需要通过阿里云的函数计算产品来设置简单事件触发器和编写一些简单OSS的程序就能完美解决上述问题,下面让我们来看看这个任务的如何分解。

 整体架构图

首先来对比一下新老架构有什么不同,老架构需要考虑三个地方的处理,例如处理OSS图片的内容、触发条件的处理、以及搭建应用服务器等。

 老的框架:

如下图,需要考虑蓝色部分,图片转码需要编写相关代码进行处理。

蓝色标注是老架构中需要关注的,程序需要一种机制对上传来的图片进行设置,例如从OSS的某个目录进行定期扫描,并批量发送到图片进行加水印,大小变化等,并把处理过的图片,用户需要搭建WEB应用,需要编写相关OSS的处理,还需要有个机制能定期做程序处理。

总结下来需要用户关注内容点:

1、对图片的处理需要编写相关代码

2、在OSS上把转码后的图片转移到新的Bucket,需要维护相关代码

3、需要考虑图片处理的及时性

 

新框架:

用户仅仅需要在Function Compute(函数计算)上设置触发器+函数,例如,监控某个Bucket下的PutObject的事件,当用户把图片上传到OSS的某个Bucket,

马上触发后续的函数代码,函数代码的无非就是把图片进行处理,并把图片转移到新的bucket中,整个过程,不需要搭建Web服务器,不需要写触发条件,

也无需关注整个服务状态如何。纯粹的事件触发后续程序,详见下图分解,仅仅一处蓝色圆圈就是需要编写的代码。

整个业务处理流程

 源码实例

基于新框架的内容,我把相关代码按块来分解,按照两块内容来处理,控制台上的操作和Fcli命令行工具的使用

 

通过控制台的操作

1、 开通service

2、新增函数计算

新建函数计算里,需要选择运行环境,目前是Nodejs4.4,后续会推出Python、Java环境等。

这个示例中选在线编辑,输入编写代码即可。

代码段:

'use strict';
module.exports.handler = function(event, context, callback) {
        var co = require('co');             //设置初始的OSS环境变量
        var OSS = require('ali-oss');
        var client = new OSS({
          region: 'oss-cn-shanghai',
          accessKeyId: ‘your accessKeyId’,     //输入你的accessKeyId
          accessKeySecret:’ your accessKey Secret’, //输入你的accessKeySecret
          bucket: 'function-demo-bucket'        //输入华东2区的bucket name
        });
        //读取bucket下的目录
        co(function* () {
          var result = yield client.list({
                prefix: 'tmp/'
          });
          var name ;
          var nameArray = result.objects;
          for(var index=0; index < nameArray.length; index++){
                var str = nameArray[index].name;
                if (str.indexOf('.jpg') > 0){
                        console.log(str);
		               //把处理后的图片存放到执行环境的/tmp目录下(tmp目录能存放的256MB文件)
                        var resize = yield client.get(str,'/tmp/example-resize.jpg',{process: 'image/resize,m_fixed,w_128,h_128'});

						//删除掉被处理完成的图片,防止第多次被处理
                        var del = yield client.delete(str);
                        console.log(del);

                        //把新处理后的图片转移到新目录下
                        name = new Date().getTime()+'.jpg';
                        var put = yield client.put('resource/'+ name,'/tmp/example-resize.jpg',{
                           meta: {
                           year: 2017,
                           people: 'wenyi'
                          }
                       });

                        callback(null, "New pic Name is : "+name);
                        console.log(name);
					}
          }
         }).catch(function(err){
           console.log(err)
         });

       callback(null, "Invk OSS is OK!");
};

3、设置OSS
的Trigger

在这个选项页里,我们选中华东2的Bucket和触发事件,触发事件目前控制台仅支持通过OSS进行触发,但是通过API或者SDK可以编写自行触发的事件。在这里,我列举控制台的方式来处理。

设置到这个地方,肯定有人会跑出来说,为什么不直接用OSS本身的URL进行resize呀,你考虑一点都没错,但是当我想把resize后的图片再存下来,怎么搞?或者我是不同Bucket下的,怎么搞?再或者,我想跨region保存,怎么搞?涉及到一系列问题,都交给OSS的SDK来处理,就要写大量代码。哪么通过FC,在一个函数中都可以自定义搞定,这样灵活方便的事情,显然不用再搭建执行环境来处理,交给FC即可。

4、查看执行结果



整个业务执行结束,完成了完整的一个例子。


时间: 2024-09-01 17:30:24

函数计算-触发OSS来处理图片加水印和大小裁剪的相关文章

使用函数计算来打包下载OSS文件

需求 打包下载OSS上存储的多个文件 方案 使用函数计算先把多个文件压缩成一个zip,存储到OSS上面,返回zip文件的地址,客户端下载此文件. 函数代码下载zip-oss.zip 实现细节 函数运行环境的磁盘空间是有限的,采用流式下载和上传的方式,只在内存中缓存少量的数据. 为了加快速度,一边生成zip文件时一边上传到OSS 上传zip文件到OSS时,利用OSS分片上传的特性,多线程并发上传 实验 实验数据 # 文件数 压缩前总大小 压缩后总大小 执行时间 1 7 1.2MB 1.16MB 0

php 为图片加水印函数和缩略图的函数代码

php 为图片加水印函数和缩略图的函数代码 /** * 为图片加水印 * @param string $desImg 目标图片 参数格式为 ./images/pic.jpg * @param string $waterImg 水印图片 参数格式同上,水印图片为 png格式,背景透明 * @param int positon 水印位置 1:顶部居左 2:顶部居右 3:居中 4 :底部居左 5:底部居右 * @param bool $saveas 是否另存为,默认值false,表示覆盖原图 * @p

aspjpeg组件通用加水印函数代码

aspjpeg组件实现加水印函数的调用方法: <%printwater "/images/水印图片.gif","/uploadfile/上传图片.jpg") %> 以下是引用片段:function printwater(waterpath,upfilepath)  Dim Logobox,LogoPath,ogvbox LogoPath = Server.MapPath(waterpath) Set Logobox = Server.CreateObje

OSS控制台新增函数计算处理事件入口

信息摘要: OSS控制台新增函数计算处理事件入口,真正双向联通存储和计算处理.发布功能: OSS控制台新增函数计算处理事件入口,真正双向联通存储和计算,通过函数计算可以管理某个函数下的触发器事件,通过OSS的某bucket可以管理该Bucket下的定义的事件,让两个产品真正融为一体,大大提升客户使用体验.适用客户: 适合的客户有,互联网客户,对存储有智能处理客户,对图片,日志有进一步加工的客户.产品文档: https://help.aliyun.com/document_detail/53097

入门篇:函数计算的基本概念和通用场景概述

4月26日,阿里云正式推出了函数计算这个微服务产品,在此之前Serverless的概念被炒的极其火热,仿佛大家要欢天喜地进入了微服务的狂欢阶段,不过光有概念很容易晕,今天我带大家一起来细化一下Serverless的基本概念.Serverless跟传统IT架构的对比.Serverless和函数计算的区别,以及函数计算最典型场景都有哪些. Serverless的基本概念 Serverless是一种基于互联网的技术架构理念,应用逻辑并非全部在服务端实现,而是采用FAAS(Function as a S

阿里云函数计算 - 事件驱动的serverless计算平台

从2006年AWS发布的第一个云服务S3开始,存储,计算等IT基础设施的能力纷纷被以服务的方式提供给用户.过去十年,云服务深刻的改变了社会获取和使用计算能力的方式,云服务自身也以极快的速度演进,新的服务形态不断涌现,无服务器计算(serverless computing)就是其中之一.阿里云函数计算,是一种事件驱动的无服务器计算服务.用户只需要编写并上传代码,阿里云函数计算会以可靠的方式执行代码,并随访问压力平滑伸缩.用户可以将代码关联多种事件源,由事件触发,也可通过http请求的方式直接调用.

函数计算-建立一个简单的数学计算函数场景

Serverless作为一种微服务是一种概念,Serverless允许你提供代码或可执行程序提交给云厂商的解析服务(如阿里云的FunctionComputer等),由解析服务来为你执行它们,而你无需自己管理服务器.配置环境.Web环境等.这就是所谓的执行即服务execution-as-a-service,这样的一种概念听起来非常吸引人,实际上也可以算是一场革命,引用一张经典图轨迹图,让大家看看整个IT运维运行的发展轨迹,如下图: 图解:犹如我们从爬行动物猩猩一样,最初靠两只手和两只脚慢慢的挪动,

C#为图片加水印代码

using System; using System.IO; using System.Collections; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace Imag_writer { /// <summary> /// 水印的类型 /// </summary> public enum WaterMarkType { /// <sum

入门篇:函数计算中角色和访问策略的讲解

阿里云函数计算是近期推出的一个无服务器的全托管的产品,使用者只需编写核心代码并设置运行的条件,即可在函数计算以弹性.安全地运行.函数计算能自行维护服务器资源,网络资源,以及消息分发和负载均衡等功能. 因为使用者需要把代码部署在函数计算上运行,能调用函数的方式有很多,可以通过APIGateway.Fcli.控制台以及OSS等各种事件源来触发函数执行,与此同时,函数计算作为执行单元需要授权交叉访问其他产品,众多的调用和模糊的安全界定,让大家在使用函数计算对角色的授权会感到困惑,其实简单来说,就是函数