首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lambda中使用多部分/表单数据

在Lambda中使用多部分/表单数据
EN

Stack Overflow用户
提问于 2020-04-02 13:49:26
回答 1查看 1.5K关注 0票数 1

我有一个从API网关调用的lambda函数。

lambda以多部分/表单数据的形式接收映像,然后lambda需要添加一些额外的标头,并使用multipart/form-data将该映像传递给另一个外部服务。

现在,我的服务是这样做的:

代码语言:javascript
复制
'use strict'
const AWS = require('aws-sdk');
const https = require('https');
const request = require('request');

exports.handler = (event, context, callback) => {

const options = {
        method: 'POST',
        url: 'https://external-service/image-storage',
        port: 443,
        headers: {
            "Content-Type": "multipart/form-data"
        },
        formData: {
            username: "67a43djte5s4cb54mnasbds23",
            secret: "47938hjfsdhjfdfdfs",
            photo: \\ I want to put here the image received in the event
        }
    };

    request(options, function(err, res, body) {
        if (err) console.log(err);
        console.log(body);
    });
}

photo参数中,我尝试放置event.body,但它不起作用,因为外部服务给了我一个“无效的请求”(我用postman尝试了外部服务,它正在正常工作)。

所以我认为问题就在蓝宝石身上。

当我在控制台中打印event.body的内容时,这是输出:

代码语言:javascript
复制
2020-04-02T13:17:27.478Z    0c03qsrf-78a2-2356-b9b0-0fd76fb367712   INFO    ----------------------------027326659651005153655343
Content-Disposition: form-data; name="image"; filename="MyImage.jpg"
Content-Type: image/jpeg
����JFIF��C...

我需要对身体进行任何额外的转化吗?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 07:36:37

如果有人有和我昨天一样的问题来到这里,最好的方法是遵循Michael Hausenblas的建议(见他在我问题下的评论),并使用S3和预先签名的urls。

然而,由于前端的一些限制,我无法采取这种方法。

最后,我必须将从多部分/表单数据内容类型到application/json的API输入替换为application/ JSON,并将base64中包含在JSON对象中的映像从我的前端发送到lambda。然后从lambda构建外部服务的多部分对象:

代码语言:javascript
复制
'use strict'
const AWS = require('aws-sdk');
const request = require('request');

exports.handler = (event, context, callback) => {

    let json_body = JSON.parse(event.body)
    var base64image = json_body.image;
    base64image = base64image.replace('data:image/jpeg;base64,', '');


    request({
        url: 'https://external-service/image-storage',
        method: 'POST',
        formData: {
          'username': '67a43djte5s4cb54mnasbds23',
          'secret': '47938hjfsdhjfdfdfs',
          'image': {
            value: Buffer.from(base64image, 'base64'),
            options: {
              filename: 'photo1.jpg',
              contentType: 'image/jpeg'
            }
          }
        }
      }, function (err,resp,body){
        if(err){
            console.log("Error");
        }else{
            console.log("Response" + body);
        }
    });   
}

正如我所说,我建议遵循预先签署的urls方法,但我提供了这个选择,以防您的前端也有限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60993114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档