2017-07-01 95 views
3

我不能讓python lambda返回二進制數據。縮略圖圖像的節點模板工作正常,但我無法獲得python lambda的工作。以下是我的lambda相關行。 print("image_data " + image_64_encode)行將base64編碼圖像打印到日誌。如何在Python中使用AWS中的lambda函數返回二進制數據?

def lambda_handler(event, context): 
    img_base64 = event.get('base64Image') 
    if img_base64 is None: 
     return respond(True, "No base64Image key") 

    img = base64.decodestring(img_base64) 
    name = uuid.uuid4() 
    path = '/tmp/{}.png'.format(name) 

    print("path " + path) 

    image_result = open(path, 'wb') 
    image_result.write(img) 
    image_result.close() 

    process_image(path) 

    image_processed_path = '/tmp/{}-processed.png'.format(name) 
    print("image_processed_path " + image_processed_path) 
    image_processed = open(image_processed_path, 'rb') 
    image_processed_data = image_processed.read() 
    image_processed.close() 
    image_64_encode = base64.encodestring(image_processed_data) 

    print("image_data " + image_64_encode) 


    return respond(False, image_64_encode) 


def respond(err, res): 
    return { 
     'statusCode': '400' if err else '200', 
     'body': res, 
     'headers': { 
      'Content-Type': 'image/png', 
     }, 
     'isBase64Encoded': 'true' 
    } 

任何指向我在做什麼錯?

+0

哪裏拉姆達? – Rahul

+0

你有什麼解決方案嗎?我也有同樣的問題。 – onurdegerli

回答

0

6個月前我面臨同樣的問題。看起來,儘管API網關中現在有二進制支持(以及JS中的示例),但Python 2.7 Lambda仍然不支持有效的二進制響應,不確定Python 3.6。

Base64編碼響應由於JSON包裝而出現問題。我在客戶端編寫了一個自定義JS,手動從這個JSON中取出base-64映像,但這也是一個糟糕的解決方案。

將結果上傳到S3(CloudFront後面)並將301返回到CloudFront似乎是一個很好的解決方法。最適合我。

0

據我所知,Python 3也是如此。我試圖返回一個二進制數據(字節)。它根本不工作。

我也試過使用base-64編碼,但我沒有成功。

這是與API網關和代理集成。

0

我終於明白了這一點。從python lambda返回二進制數據是可行的。

按照這裏的說明: https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/

一定要檢查的「使用LAMBDA代理一體化」創建一個新的方法時。

還要確保你的Python拉姆達響應的樣子:

return {'isBase64Encoded' : True, 
     'statusCode'  : 200, 
     'headers'   : { 'Content-Type': content_type }, 
     'body'    : base64_encoded_binary_data} 

THEN:

對於每一個你的路由/方法問題:

apigateway update-integration-response --rest-api-id <api-id> --resource-id <res-id> --http-method POST --status-code 200 --patch-operations "[{\"op\" : \"replace\", \"path\" : \"/contentHandling\", \"value\" : \"CONVERT_TO_BINARY\"}]" 

在AWS控制檯。 的,並且可以在API中可以看到網關 '麪包屑' 例如:

<api-id> = zdb7jsoey8 
<res-id> = zy2b5g 

THEN: 你需要 '部署API'。從我發現的只有它在部署API之後才起作用。

確保在部署之前設置「二進制媒體類型」。

提示: 尼斯AWS殼終端位置:https://github.com/awslabs/aws-shell

pip install aws-shell 
相關問題