【问题标题】:How to receive a FormData with method POST AJAX in python3?如何在 python3 中使用 POST AJAX 方法接收 FormData?
【发布时间】:2020-09-13 12:17:51
【问题描述】:

我正在尝试使用 POST 将图像上传到 AWS 上的存储桶,我应该如何在 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 Lambda 中检索以保存在 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 发送的相同类型的文件,因此它损坏了图像。

当我使用 AJAX 在 FormData 中发送文件时,我会得到什么类型的文件?

我也尝试在 Base64 上以字符串形式发送图像,但它也损坏了。

【问题讨论】:

  • 为什么要发布表单而不是文件数据本身?
  • 如果你想解析multipart/form-data,看看这个答案。 stackoverflow.com/a/33370069/10692493
  • @jellycsc 我还没有找到发送文件的方法,所以我就这样使用它。我会查看您发送的链接,谢谢。

标签: javascript python-3.x ajax image amazon-s3


【解决方案1】:

我设法解决了我的问题。

我将图像转换为 Base64,并将其发送到 Lambda 以保存在 AWS Bucket 中。 Lambda再次收到转Base64的Data,所以我解码了两次,得到了正确的图像。

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)

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多