做者:澤塵前端
隨着具備不一樣屏幕尺寸和分辨率設備的爆炸式增加,開發人員常常須要提供各類尺寸的圖像,從而確保良好的用戶體驗。目前比較常見的作法是預先爲一份圖像存放多份具備不一樣尺寸的副本,在前端根據用戶設備的 media 信息來請求特定的圖像副本。node
預先爲一份圖像存放多份具備不一樣尺寸副本的行爲,常常是經過 阿里雲函數計算 FC 以及阿里雲對象存儲 OSS 兩大產品實現的。用戶事先爲 FC 中的函數設置對象存儲觸發器,當在存儲桶中建立了新對象(即 putObject 行爲,此處指在 OSS bucket 中存放了圖像),經過 OSS 觸發器來觸發函數對剛剛存放的圖像進行處理,處理成不一樣尺寸的副本後,將這些副本存放進 OSS bucket。git
上述方法的特色是預先處理,若是要處理的圖像尺寸較多,那麼當圖像數量很是大的時候,會佔用不少存儲空間。假設要處理的圖像尺寸數目爲 x、圖像數量爲 y、平均每份圖像的大小爲 z,那麼要佔用的存儲空間爲 x _ y _ z。github
動態調整圖像大小 爲了不無用的圖像佔用存儲空間,可使用動態調整圖像大小的方法。在 OSS bucket 中預先只爲每份圖像存放一個副本,當前端根據用戶設備的 media 信息來請求特定尺寸圖像副本時,再生成相關圖像。npm
步驟:api
上述方法的特色是:瀏覽器
在 OSS 控制檯 中,建立一個新的 Bucket,讀寫權限選擇公共讀 (用於本教程示例,可以後更改)。 less
在 Bucket 的基礎設置中,設置鏡像回源。運維
git clone git@github.com:ChanDaoH/serverless-image-on-the-fly.git
dom
npm install
template.yml
文件中的相關內容:OSS_REGION、OSS_BUCKET_NAME、自定義域名ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: serverless-image: Type: 'Aliyun::Serverless::Service' Properties: Description: This is serverless-image service Policies: - AliyunOSSFullAccess image-resize: Type: 'Aliyun::Serverless::Function' Properties: Handler: src/index.handler Runtime: nodejs10 Timeout: 60 MemorySize: 512 CodeUri: ./ EnvironmentVariables: OSS_REGION: oss-cn-shanghai # oss region, such as oss-cn-shanghai、oss-cn-hangzhou OSS_BUCKET_NAME: images-xxx # oss bucket name Events: httpTrigger: Type: HTTP Properties: AuthType: ANONYMOUS Methods: - GET - POST william.functioncompute.com: # domain name Type: 'Aliyun::Serverless::CustomDomain' Properties: Protocol: HTTP RouteConfig: routes: '/*': ServiceName: serverless-image FunctionName: image-resize
image.jpg
。https://{OSS_BUCKET_NAME}.{OSS_REGION}.aliyuncs.com/{width}*{height}/image.jpg
。會有以下效果:
width * height
大小的 image.jpg。width * height
命名的目錄,該目錄下有 image.jpg。咱們經過 FC + OSS 搭建了一個實時按需圖像處理服務,該服務擁有如下特色:
「阿里巴巴雲原生技術圈關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」