Как выгрузить двоичный контент из записи AJAX в файл на python? - PullRequest
0 голосов
/ 10 ноября 2019

Я делаю запрос POST Ajax, который отправляет записанное аудио на AWS Lambda, что является функцией Python. Когда я пытаюсь сбросить содержимое event['body'] в S3, я получаю поврежденный аудиофайл .webm.

Javascript:

...
rec = new MediaRecorder(stream, {mimeType: "audio/webm;codecs=opus"});
...
    var http = new XMLHttpRequest();
    http.open('POST', 'https://url.execute-api.us-east-1.amazonaws.com/prod/audio', true);
    var blob = new Blob(audioChunks, { 'type' : 'audio/webm; codecs=opus' });
    http.setRequestHeader('Content-type', 'audio/webm;codecs=opus');
    http.send(blob);

Python Lambda:

import json
import boto3

def lambda_handler(event, context):
    # TODO implement

    print(event)
    s3_client = boto3.client('s3', aws_access_key_id='',aws_secret_access_key='')
    # filename=
    s3_client.put_object(Body=event['body'], Bucket='bucket', Key='incoming/test.webm')

    return {
        'statusCode': 200,
       'headers': {
        'Access-Control-Allow-Origin': '*'
        },
        'body': json.dumps(event)
    }

Cloudwatch Logs:

'userAgent': 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36', 'accountId': None, 'caller': None, 'sourceIp': '', 'accessKey': None, 'cognitoAuthenticationProvider': None, 'user': None}, 'domainName': 'aws-api-url', 'apiId': 's5inhs5z22'}, 'body': '\x1aEߣ�B��\x01B��\x01B�\x04B�\x08B��webmB��\x04B��\x02\x18S�g\x01�������\x15I�f�*ױ�\x0fB@M��ChromeWA�Chrome\x16T�k���ׁ\x01sŇ$�O�\x01ӝ��\x02��A_OPUSc��OpusHead\x01\x01\x00\x00��\x00\x00\x00\x00\x00፵�G;�\x00��\x01bd� \x1fC�u\x01��������\x00�A�\x00\x00�������?R~y�r��8��\x17\x0e�J��oy�v\\���ON\x1c\\�f�\rA�\u05f9�~\x1b\'�e�\x12as�8\x11;Q�\n\x10�^,�#\x1cλ�\x1b\x0b���?�`�u�מ�䘸\x0c�ί��J�Y\x12i_O�����+�����E��E�͡�e�\x17ą�nݎ�\x039a�X`Wm��j\x0bu��#�\n�?\x10���c�\x0b!�?

Я не уверен, как обращаться с этим типом данных, Python сохраняет его как строку? Мой звук работает, если я обращаюсь к нему в браузере, используя blob:https://s3url.com/some-string

...