溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Serverless文件上傳優(yōu)化

發(fā)布時(shí)間:2021-12-16 12:02:11 來(lái)源:億速云 閱讀:167 作者:柒染 欄目:云計(jì)算

如何進(jìn)行Serverless文件上傳優(yōu)化,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

前言

當(dāng)開發(fā)者需要搭建一個(gè) Web 應(yīng)用或移動(dòng)端程序時(shí),可以使用云函數(shù)作為后端服務(wù),由 API 網(wǎng)關(guān)接收客戶端請(qǐng)求,并觸發(fā)云函數(shù)處理。這樣的 Serverless 架構(gòu)具備簡(jiǎn)單便捷、可彈性擴(kuò)展、高可用等優(yōu)勢(shì),正成為越來(lái)越多人的共同選擇。

但開發(fā)者在搭建應(yīng)用時(shí),難免會(huì)遇到上傳文件的場(chǎng)景,如 App 上傳用戶頭像、個(gè)人博客文章圖片、網(wǎng)站評(píng)論圖片,這些都需要上傳文件到后端。如果您的業(yè)務(wù)托管在主機(jī)上,上傳文件往往不受限制,可使用 multipart/form-data 方式直接上傳文件;但在 Serverless架構(gòu)下,由于 API 網(wǎng)關(guān)和云函數(shù)之間只支持傳輸 JSON 數(shù)據(jù),使用傳統(tǒng)方式上傳文件較為困難,一般的解決方案是由客戶端通過 Base64 等算法,先將文件從二進(jìn)制轉(zhuǎn)換為字符后再進(jìn)行上傳。

近期騰訊云 Serverless 團(tuán)隊(duì)優(yōu)化了上傳文件體驗(yàn),上線了 API 網(wǎng)關(guān) Base64 編碼功能,上傳文件時(shí)原本由客戶端做的 Base64 編碼過程變?yōu)橛?API 網(wǎng)關(guān)進(jìn)行,這使得開發(fā)者無(wú)需改動(dòng)客戶端代碼即可將二進(jìn)制文件上傳至云函數(shù) SCF。同時(shí),前端開發(fā)中一般可基于 Base64 格式完成圖片的存儲(chǔ)和展現(xiàn),使得該功能對(duì)前端開發(fā)者來(lái)說非常友好。

下面對(duì) Serverless 和傳統(tǒng)方式 multipart 上傳多文件的過程進(jìn)行了對(duì)比,并介紹了Base64 編碼功能的配置方式。

請(qǐng)求過程對(duì)比

傳統(tǒng)方式上傳文件過程

如果您的后端服務(wù)托管在云主機(jī)上,一般上傳文件的請(qǐng)求過程如下:

  • 第一步:客戶端可直接使用 multipart/form-data 方式上傳文件;

  • 第二步:在后端服務(wù)中獲取二進(jìn)制文件。

以下是一段客戶端上傳兩張圖片 pic-1.jpg 和 pic-2.jpg 到后端服務(wù)的 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 上傳文件過程

如何進(jìn)行Serverless文件上傳優(yōu)化

如圖是采用 API 網(wǎng)關(guān)結(jié)合云函數(shù),開啟 Base64 功能后上傳文件的請(qǐng)求過程:

  1. 客戶端可直接使用 multipart/form-data 方式上傳文件;

  2. 在云函數(shù)中獲取經(jīng)過 Base64 編碼的文本。

對(duì)比結(jié)論

通過以上兩種方式的對(duì)比,我們不難看出,Base64編碼功能的最大優(yōu)勢(shì)在于使 Serverless 獲得了和傳統(tǒng)方式完全一致的上傳文件體驗(yàn),可直接使用傳統(tǒng)方式的客戶端代碼進(jìn)行上傳。

另外,在云函數(shù)中獲取了經(jīng)過 Base64 編碼的文本后,您只需對(duì) event.body 進(jìn)行解碼,就可以得到二進(jìn)制文件了。以下是一段在云函數(shù)中解碼多文件的 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 包的形式安裝相關(guān)依賴。

實(shí)戰(zhàn)配置

為滿足不同場(chǎng)景的要求,Base64 編碼功能還提供了“全部觸發(fā)”和“Header 觸發(fā)”兩種觸發(fā)方式供您選擇:

  • 全部觸發(fā):API 開啟全部觸發(fā)后,每次請(qǐng)求的請(qǐng)求內(nèi)容都會(huì)被 Base64 編碼后再傳遞給云函數(shù)。

  • Header 觸發(fā):API 開啟 Header 觸發(fā)后,必須配置觸發(fā)規(guī)則。API 網(wǎng)關(guān)將根據(jù)觸發(fā)規(guī)則對(duì)請(qǐng)求頭進(jìn)行校驗(yàn),只有擁有特定 Content-Type 或 Accept 請(qǐng)求頭的請(qǐng)求會(huì)被 Base64 編碼后再傳遞給云函數(shù),不滿足條件的請(qǐng)求將不進(jìn)行 Base64 編碼,直接傳遞給云函數(shù)。

以下將分別敘述兩種觸發(fā)方式的配置過程:

配置全部觸發(fā)

  1. 登錄 API 網(wǎng)關(guān)控制臺(tái) ,在左側(cè)導(dǎo)航欄單擊【服務(wù)】。

  2. 在服務(wù)列表中,單擊目標(biāo)服務(wù)的服務(wù) ID,查看 API 列表。

  3. 單擊【新建】,填寫 API 前端配置,單擊【下一步】。

  4. API 后端類型選擇【云函數(shù)SCF】,勾選“Base64編碼”,完成后續(xù)配置流程。此時(shí)創(chuàng)建的 API 已經(jīng)開啟了 Base64 編碼,并默認(rèn)為“全部觸發(fā)”。

如何進(jìn)行Serverless文件上傳優(yōu)化

配置 Header 觸發(fā)

  1. 登錄 API 網(wǎng)關(guān)控制臺(tái) ,在左側(cè)導(dǎo)航欄單擊【服務(wù)】。

  2. 在服務(wù)列表中,單擊目標(biāo)服務(wù)的服務(wù) ID,查看 API 列表。

  3. 在 API 列表中,單擊目標(biāo) API 的 API ID(目標(biāo) API 必須是后端對(duì)接 SCF 的 API),即可查看 API 詳情頁(yè)。 在 API 詳情頁(yè)中,單擊【基礎(chǔ)配置】標(biāo)簽頁(yè),找到【Base64編碼】配置項(xiàng)。

  4. 單擊"Base64"后的【編輯】,選擇觸發(fā)方式為【Header觸發(fā)】。單擊【添加觸發(fā)規(guī)則】,選擇參數(shù)并填寫參數(shù)值。

  5. 確認(rèn)配置信息無(wú)誤后,最后單擊【保存】即可。

如何進(jìn)行Serverless文件上傳優(yōu)化

關(guān)于如何進(jìn)行Serverless文件上傳優(yōu)化問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI