Как получить FormData методом POST AJAX в python3? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь загрузить изображение в Bucket на AWS с помощью POST, как мне декодировать в python3?

Когда я использую программу для создания метода Post (Insomnia), правильно сохраняется в Bucket. Но когда я делаю это с Ajax, он также сохраняется с тем же размером файла, но когда я открываю изображение, оно не работает, изображение повреждено.

Отправить с AJAX:

var form;
$("#file").change(function() {
    form = new FormData();
    form.append('file', event.target.files[0]);
});


function uploadFile(){
    $.ajax({
        url: 'myUrlApi',
        crossDomain : true,
        processData: false,
        data: form,
        contentType: 'image/png',
        type: 'POST',
        success: function (data) {
            console.log(data)
        }
    });
}

Получить в python3 Лямбда для сохранения в Bucket:

import boto3
import base64


def lambda_handler(event, context):

    s3 = boto3.client("s3")
    get_file_content = event["content"]
    decode_content = base64.b64decode(get_file_content)
    s3.put_object(Bucket="mybucket", Key="exampleUpload.png", Body=decode_content)

Я не могу воспроизвести тот же тип файла, когда он отправляется Insomnia, поэтому он повреждает изображение .

Какой тип файла я получаю, когда отправляю файл в FormData с AJAX?

Я также пытался отправить изображение в строке на Base64 , но он тоже испорчен.

1 Ответ

0 голосов
/ 27 мая 2020

Мне удалось решить мою проблему.

Я преобразовал свое изображение в Base64 и отправил его в Lambda для сохранения в AWS Bucket. Lambda снова получает данные, преобразованные в Base64, поэтому я дважды декодировал их и получил правильное изображение.

var fileInB64 = ''

function getBase64(file) {
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function () {
        fileInB64 = reader.result.split(',')[1];
    };
    reader.onerror = function (error) {
        console.log('Error: ', error);
    };
}

$("#file").change(function() {
    var file = document.querySelector('.divFile > input[type="file"]').files[0];
    getBase64(file)
});

function uploadFile(){
    $.ajax({
        url: 'myUrlApi',
        crossDomain : true,
        processData: false,
        data: fileInB64,
        contentType: 'image/png',
        type: 'POST',
        success: function (data) {
            console.log(data)
        }
    });
}

А в Lambda python3 я дважды декодировал их и получил правильное изображение.

import boto3
import base64


def lambda_handler(event, context):

    s3 = boto3.client("s3")
    get_file_content = event["content"]

    stringBase64 = base64.b64decode(get_file_content)
    toBase64FromBase64 = base64.b64decode(stringBase64)

    s3.put_object(Bucket="mybucket", Key="exampleUpload.png", Body=toBase64FromBase64)
...