2017-07-17 122 views
0

我有以下簡單AWS聖盃路線:從AWS聖盃的multipart/form-data的http請求raw_body解析

@app.route('/submit', methods=['POST'], 
      content_types=['multipart/form-data']) 
def submit(): 
    request_info = app.current_request.raw_body 

    return request_info 

我然後用一種簡單的形式與多部分數據,包括一個DOCX文件上載:

<form enctype="multipart/form-data" method="POST" action="http://localhost:8000/submit"> 
    <input name='foo' type="text"> 
    <br> 
    <input name="bar" type="file"> 
    <br> 
    <button type='submit'> 
    Submit 
    </button> 
</form> 

請求的raw_body屬性只是http請求的字節,我在尋找一個預先存在的Python庫,它可以讓我提取每個表單字段並將docx文件的字節寫入磁盤(在這種情況下,AWS Lambda中爲tmp文件夾)。是否有一個庫將以raw_body作爲參數,並允許我解析各個字段,以便我不必自己編寫這樣的解析器?試圖谷歌這是很困難的,因爲大部分返回的結果都與使用python來使用web API,這不是我想要的。

回答

0

Bellow是一個示例lambda代碼,它將採用multipart/form-data並解析它並獲取文件並獲取文件類型。

import magic 
from io import BytesIO 
import json 
import cgi 

def lambda_handler(event, context): 
    content_type_obj = event['params']['header']['content-type'] 
    content_type, property_dict = cgi.parse_header(content_type_obj) 
    form_data = cgi.parse_multipart(BytesIO(event['body-json'].decode('base64')), property_dict) 
    form_file = form_data['file'][0] 
    file_type = magic.from_buffer(form_file, mime=True) 
    file_name = "new_file." + file_type.split('/')[-1] or "txt" 
    # process your file 
    # file_type will give you mime type of the file like "image/png" 
    print file_type 

    return {'statusCode': 200, 
      'body': json.dumps({"status": "success", 
           "message": "your request for uploading has been accepted."}), 
      'headers': { 
      'Content-Type': 'application/json', 
      }} 

添加魔法拉姆達指包裝

http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html

+0

的CGI庫的作品,即使它的氣質。對於閱讀這個使用Chalice的人來說,我的實際解決方案是在路由功能定義中對base64進行編碼和解碼。這會以一定百分比增加數據傳輸,但更容易排除故障。 –

+0

@JoeStech你可以使用zappa燒瓶,上傳的文件將在request.files中可用,因爲我們通常在燒瓶中得到。那麼它更容易調試。沒有提到你將擁有文件的所有屬性mimetype,內容長度等。 – Anurag