关于腾讯云:Serverless-文件上传优化

4次阅读

共计 2623 个字符,预计需要花费 7 分钟才能阅读完成。

前言

当开发者须要搭建一个 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 requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
from 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 性能后上传文件的申请过程:

  1. 客户端可间接应用 multipart/form-data 形式上传文件;
  2. 在云函数中获取通过 Base64 编码的文本。

比照论断

通过以上两种形式的比照,咱们不难看出,Base64 编码性能的最大劣势在于使 Serverless 取得了和传统形式完全一致的上传文件体验,可间接应用传统形式的客户端代码进行上传。

另外,在云函数中获取了通过 Base64 编码的文本后,您只需对 event.body 进行解码,就能够失去二进制文件了。以下是一段在云函数中解码多文件的 Python 3 参考代码:

# -*- coding: utf-8 -*-

import sys
import logging
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
from requests_toolbelt.multipart import decoder
import base64
import json

print('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 编码,间接传递给云函数。

以下将别离叙述两种触发形式的配置过程:

配置全副触发

  1. 登录 API 网关控制台,在左侧导航栏单击【服务】。
  2. 在服务列表中,单击指标服务的服务 ID,查看 API 列表。
  3. 单击【新建】,填写 API 前端配置,单击【下一步】。
  4. API 后端类型抉择【云函数 SCF】,勾选“Base64 编码”,实现后续配置流程。此时创立的 API 曾经开启了 Base64 编码,并默认为“全副触发”。

配置 Header 触发

  1. 登录 API 网关控制台,在左侧导航栏单击【服务】。
  2. 在服务列表中,单击指标服务的服务 ID,查看 API 列表。
  3. 在 API 列表中,单击指标 API 的 API ID(指标 API 必须是后端对接 SCF 的 API),即可查看 API 详情页。在 API 详情页中,单击【根底配置】标签页,找到【Base64 编码】配置项。
  4. 单击 ”Base64″ 后的【编辑】,抉择触发形式为【Header 触发】。单击【增加触发规定】,抉择参数并填写参数值。
  5. 确认配置信息无误后,最初单击【保留】即可。

One More Thing

立刻体验腾讯云 Serverless Demo,支付 Serverless 新用户礼包 ???? serverless/start

欢送拜访:Serverless 中文网!

正文完
 0