前言
当开发者须要搭建一个 Web 利用或挪动端程序时,能够应用云函数作为后端服务,由 API 网关接管客户端申请,并触发云函数解决。这样的 Serverless 架构具备简略便捷、可弹性扩大、高可用等劣势,正成为越来越多人的独特抉择。
但开发者在搭建利用时,难免会遇到上传文件的场景,如 App 上传用户头像、集体博客文章图片、网站评论图片,这些都须要上传文件到后端。如果您的业务托管在主机上,上传文件往往不受限制,可应用 multipart/form-data 形式间接上传文件;但在 Serverless架构下,因为 API 网关和云函数之间只反对传输 JSON 数据,应用传统形式上传文件较为艰难,个别的解决方案是由客户端通过 Base64 等算法,先将文件从二进制转换为字符后再进行上传。
近期腾讯云 Serverless 团队优化了上传文件体验,上线了 API 网关 Base64 编码性能,上传文件时本来由客户端做的 Base64 编码过程变为由 API 网关进行,这使得开发者无需改变客户端代码即可将二进制文件上传至云函数 SCF。同时,前端开发中个别可基于 Base64 格局实现图片的存储和展示,使得该性能对前端开发者来说十分敌对。
本文对 Serverless 和传统形式 multipart 上传多文件的过程进行了比照,并介绍了Base64 编码性能的配置形式。
申请过程比照
传统形式上传文件过程
如果您的后端服务托管在云主机上,个别上传文件的申请过程如下:
- 第一步:客户端可间接应用 multipart/form-data 形式上传文件;
- 第二步:在后端服务中获取二进制文件。
以下是一段客户端上传两张图片 pic-1.jpg 和 pic-2.jpg 到后端服务的 Python 3 参考代码:
import requestsfrom requests_toolbelt.multipart.encoder import MultipartEncoderfrom requests_toolbelt.multipart import decoder m = MultipartEncoder( fields=[ ('files[]',('file.jpg', open('pic-2.jpg', 'rb'), 'image/jpeg')), ('files[]',('file2.jpg', open('pic-1.jpg', 'rb'), 'image/jpeg')), ] )res = requests.post(url='https://yourwebsite.com/upload', data=m, headers={'Content-Type': m.content_type})json = res.json()print(json)
Serverless 上传文件过程
如图是采纳 API 网关联合云函数,开启 Base64 性能后上传文件的申请过程:
- 客户端可间接应用 multipart/form-data 形式上传文件;
- 在云函数中获取通过 Base64 编码的文本。
比照论断
通过以上两种形式的比照,咱们不难看出,Base64编码性能的最大劣势在于使 Serverless 取得了和传统形式完全一致的上传文件体验,可间接应用传统形式的客户端代码进行上传。
另外,在云函数中获取了通过 Base64 编码的文本后,您只需对 event.body 进行解码,就能够失去二进制文件了。以下是一段在云函数中解码多文件的 Python 3 参考代码:
# -*- coding: utf-8 -*-import sysimport loggingimport requestsfrom requests_toolbelt.multipart.encoder import MultipartEncoderfrom requests_toolbelt.multipart import decoderimport base64import jsonprint('Loading function')logger = logging.getLogger()def main_handler(event, context): logger.info("start main handler") content_type_header = event['headers']['content-type'] body = event['body'] is_me = base64.b64decode(body) for part in decoder.MultipartDecoder(is_me, content_type_header).parts: print(part.content)
留神:须要应用层或上传 zip 包的模式装置相干依赖。
实战配置
为满足不同场景的要求,Base64 编码性能还提供了“全副触发”和“Header 触发”两种触发形式供您抉择:
- 全副触发:API 开启全副触发后,每次申请的申请内容都会被 Base64 编码后再传递给云函数。
- Header 触发:API 开启 Header 触发后,必须配置触发规定。API 网关将依据触发规定对申请头进行校验,只有领有特定 Content-Type 或 Accept 申请头的申请会被 Base64 编码后再传递给云函数,不满足条件的申请将不进行 Base64 编码,间接传递给云函数。
以下将别离叙述两种触发形式的配置过程:
配置全副触发
- 登录 API 网关控制台 ,在左侧导航栏单击【服务】。
- 在服务列表中,单击指标服务的服务 ID,查看 API 列表。
- 单击【新建】,填写 API 前端配置,单击【下一步】。
- API 后端类型抉择【云函数SCF】,勾选“Base64编码”,实现后续配置流程。此时创立的 API 曾经开启了 Base64 编码,并默认为“全副触发”。
配置 Header 触发
- 登录 API 网关控制台 ,在左侧导航栏单击【服务】。
- 在服务列表中,单击指标服务的服务 ID,查看 API 列表。
- 在 API 列表中,单击指标 API 的 API ID(指标 API 必须是后端对接 SCF 的 API),即可查看 API 详情页。 在 API 详情页中,单击【根底配置】标签页,找到【Base64编码】配置项。
- 单击"Base64"后的【编辑】,抉择触发形式为【Header触发】。单击【增加触发规定】,抉择参数并填写参数值。
- 确认配置信息无误后,最初单击【保留】即可。
One More Thing
立刻体验腾讯云 Serverless Demo,支付 Serverless 新用户礼包 ???? serverless/start
欢送拜访:Serverless 中文网!