您好,登錄后才能下訂單哦!
如何進行Serverless文件上傳優化,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
當開發者需要搭建一個 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)
如圖是采用 API 網關結合云函數,開啟 Base64 功能后上傳文件的請求過程:
客戶端可直接使用 multipart/form-data 方式上傳文件;
在云函數中獲取經過 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 編碼,直接傳遞給云函數。
以下將分別敘述兩種觸發方式的配置過程:
登錄 API 網關控制臺 ,在左側導航欄單擊【服務】。
在服務列表中,單擊目標服務的服務 ID,查看 API 列表。
單擊【新建】,填寫 API 前端配置,單擊【下一步】。
API 后端類型選擇【云函數SCF】,勾選“Base64編碼”,完成后續配置流程。此時創建的 API 已經開啟了 Base64 編碼,并默認為“全部觸發”。
登錄 API 網關控制臺 ,在左側導航欄單擊【服務】。
在服務列表中,單擊目標服務的服務 ID,查看 API 列表。
在 API 列表中,單擊目標 API 的 API ID(目標 API 必須是后端對接 SCF 的 API),即可查看 API 詳情頁。 在 API 詳情頁中,單擊【基礎配置】標簽頁,找到【Base64編碼】配置項。
單擊"Base64"后的【編輯】,選擇觸發方式為【Header觸發】。單擊【添加觸發規則】,選擇參數并填寫參數值。
確認配置信息無誤后,最后單擊【保存】即可。
關于如何進行Serverless文件上傳優化問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。