简体   繁体   English

使用 Api Gateway、Lambda 函数将图像上传到 S3 存储桶

[英]Upload Image into S3 bucket using Api Gateway, Lambda funnction

I'm trying to upload the image (base64) from the postman, I can see when I hit the Serverless API, something has been added in S3 bucket but not image, I'm using nodejs Lambda function, I tried so many solutions but that didn't work out.我正在尝试从邮递员上传图像(base64),我可以看到当我点击无服务器 API 时,S3 存储桶中添加了一些东西但没有图像,我正在使用 nodejs Lambda 函数,我尝试了很多解决方案但是那没有成功。 Please suggest me where I'm wrong:请建议我哪里错了:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const moment = require('moment');
const fileType = require('file-type');
const sha1 = require('sha1');
const multipart = require('parse-multipart');

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

    let request = event.body;

    // get the request
    let base64String = request.base64String;

    // pass the base64 string into a buffer
    let buffer = new Buffer(base64String, 'base64');

    let fileMime = fileType(buffer);

    // check if the base64 encoded string is a file
    if (fileMime === null) {
        return context.fail('The string supplied is not a file type');
    }

    let file = getFile(fileMime, buffer);
    // let file = getFile(fileMime, parts);
    let params = file.params;

    s3.upload(params, function (err, data) {
    // putObject(params, function (err, data) {
        if (err) {
            console.log(err);
            callback(err);
        }

        // if the file object is uploaded successfully to 
        // s3 then you can get your full url
        console.log('File URL', file.full_path + JSON.stringify(data));
        callback(null, data);

    });
}

let getFile = function (fileMime, buffer) {

    // get the file extension
    let fileExt = fileMime.ext;
    let hash = sha1(new Buffer(new Date().toString()));
    let now = moment().format('YYYY-MM-DD');

    let filePath = hash + '/';
    let fileName = now + '.' + fileExt;
    let fileFullName = filePath + fileName;
    let fileFullPath = 'https://console.aws.amazon.com/s3/buckets/bucket-name/images/' + fileFullName;

    console.log('fileFullPath' + fileFullPath);
    let params = {
        Bucket: 'bucket-name',
        Key: fileFullPath,
        // 'this is simply the filename and the extension, e.g fileFullName + fileExt',
        Body: buffer
    };

    let uploadFile = {
        size: buffer.toString('ascii').length,
        type: fileMime.mime,
        name: fileName,
        full_path: fileFullPath
    }

    return {
        'params': params,
        'uploadFile': uploadFile
    }
}

S3 存储桶中的响应

单击任何响应时,完整的输出将以图像形式出现

Postman base64 图像字符串

Please let me know, where I'm missing some piece of codes.请让我知道,我在哪里遗漏了一些代码。 That will be appreciated.我们将不胜感激。

When uploading objects to S3 that should be opened in a web browser, you need to set the correct content type.将对象上传到 S3 并应在 Web 浏览器中打开时,您需要设置正确的内容类型。 When S3 serves your object, the content type you set will be sent as a HTTP header.当 S3 为您的对象提供服务时,您设置的内容类型将作为 HTTP 标头发送。

Web browsers use MIME types to determine how to process URLs, not file extensions. Web 浏览器使用MIME 类型来确定如何处理 URL,而不是文件扩展名。

In your case, the content type is missing from the parameters your are passing to s3.upload .在您的情况下,您传递给s3.upload的参数中缺少内容类型。 Moreover, the key is incorrect.而且,密钥不正确。

It should be:它应该是:

const params = {
  Bucket: 'bucket-name',
  Key: fileFullName // must be a path within your bucket and not an url like you have in fileFullPath,
  Body: buffer,
  ContentType: fileMime.mime // Sets the content type header, without this your browser cannot infer the type (browsers use mime types, not file extensions)
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM