我有一个从API网关调用的lambda函数。
lambda以多部分/表单数据的形式接收映像,然后lambda需要添加一些额外的标头,并使用multipart/form-data将该映像传递给另一个外部服务。
现在,我的服务是这样做的:
'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的内容时,这是输出:
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...我需要对身体进行任何额外的转化吗?
谢谢,
发布于 2020-04-04 07:36:37
如果有人有和我昨天一样的问题来到这里,最好的方法是遵循Michael Hausenblas的建议(见他在我问题下的评论),并使用S3和预先签名的urls。
然而,由于前端的一些限制,我无法采取这种方法。
最后,我必须将从多部分/表单数据内容类型到application/json的API输入替换为application/ JSON,并将base64中包含在JSON对象中的映像从我的前端发送到lambda。然后从lambda构建外部服务的多部分对象:
'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方法,但我提供了这个选择,以防您的前端也有限制。
https://stackoverflow.com/questions/60993114
复制相似问题