2016-03-04 138 views
0

說我有這樣的HTML:AWS API網關和Lambda返回圖像

<img src="http://example.com/pic"/> 

我想什麼做的是有example.com/pic映射到AWS API網關端點。

該端點將調用lambda函數。

該lambda函數將讀取s3存儲桶中的隨機圖像並將其返回。

所以我的目標是使用STANDARD HTML圖像標籤,並結束從s3存儲桶中的圖像,但要通過lambda中的某些決定代碼來決定要返回的圖像。

我知道你可以使用s3直接提供靜態內容(因此lambda決定了什麼圖像)。我也知道我可以做lambda中的東西,比如b64編碼響應,然後在客戶端處理它,但我打算使用標準的HTML IMG標記。

這可能嗎?

我已經嘗試使用ResponseStreamHandler(Java SDK)爲lambda並返回圖像的字節數組,並且還添加了API網關配置,以便不將輸出映射到JSON,但似乎沒有任何效果!

回答

2

只要是明確的,客戶端要兩個不同的要求:

  1. 第一個拿到HTML(包括圖像URL)。
  2. 第二個從url中獲取圖像數據。

換句話說,圖像數據未在HTML中內聯。

根據這些知識,您可以按照您的建議使用Lambda(位於API網關之後)。 Lambda實現可以有一些邏輯來確定S3中存儲的圖像的url。但是,Lambda返回的是JSON數據而不是HTML(有一些解決方法,如return the html in a variable),這使事情變得更加棘手,特別是對於大型HTML頁面。

我建議一個稍微不同的方法,因爲只是接收圖像標記不會讓你遠。我假設你會在HTML文檔中嵌入圖像標籤,可能是使用JavaScript。然後,您可以讓API網關/ Lambda請求返回帶有圖片網址的JSON文檔,並讓JavaScript使用新網址更新現有圖片代碼或爲您生成代碼。

0

目前不可能,因爲您無法通過AWS API網關返回二進制數據。

爲此,lambda函數需要將圖像數據作爲二進制blob和一些元信息(如圖像內容類型)返回。然後,AWS API網關需要能夠將其映射到HTTP響應。例如: -

拉姆達回報: { contentType: 'image/png', image: "encoded binary data" }

然後API網關將需要的contentType映射到響應的「內容類型」標題,並把圖像數據與所述響應的體正確的編碼和長度。

不幸的是,它現在不這樣做。它只映射像application/json或application/xml這樣的文本編碼作爲響應類型(它畢竟是爲API設計的)。

使用ElasticBeanstalk您可以非常輕鬆地實現此目的,您可以更輕鬆地控制http響應。

4

我跑到類似的問題。如上所述,您目前無法直接從您的API網關端點以二進制格式返回圖像,這對於瀏覽器正確顯示它是必需的。

但是,我解決這個問題的方式是讓API Gateway返回一個302重定向,指向S3中的正確文件。您可以讓Lambda函數將url返回到該文件,稍後將該文件映射到API網關中的位置標題。瀏覽器將遵循重定向並正確顯示圖像。

有執行重定向幾種方法,但我做了如下:

  • 拉姆達返回一個對象,象這樣的目標圖像:

    function handler(event, context) { 
        context.succeed({ 
         location: "https://[bucket-name].s3-eu-west-1.amazonaws.com/myimage.png" }); 
        }); 
    } 
    
  • 刪除正常的「200 '來自API網關中的集成響應的方法響應狀態。用「302」響應狀態替換它,並添加「位置」報頭映射到值「integration.response.body.location」

  • 302種狀態添加到該方法的響應以及

+0

爲我工作的唯一解決方案。 –

4

幸運的是,現在AWS API Gateway支持二進制數據,但您還需要通過CLI更新資源方法,因爲它尚未在控制檯中實現。這就是你需要做什麼:

  1. 在HTTP 200狀態響應 頭的方法
    設置Content-Typeimage/jpeg方法響應
  2. 在你的方法的合併響應
    在標題映射中將Content-Type設置爲'image/jpeg'注意引號!
  3. 有了AWS CLI,您的合併響應

檢查這個偉大的一步一步的指導,在設定contentHandling屬性CONVERT_TO_BINARY到全過程:https://stackoverflow.com/a/41434295/720665