使用 Api 网关、Lambda 函数将图像上传到 S3 存储桶
Upload Image into S3 bucket using Api Gateway, Lambda funnction
我正在尝试从邮递员上传图像 (base64),当我点击无服务器时我可以看到 API,S3 存储桶中添加了一些东西但没有图像,我正在使用 nodejs Lambda 函数,我尝试了很多解决方案但没有成功。请告诉我哪里错了:
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
}
}
请让我知道我遗漏了一些代码。我们将不胜感激。
将objects上传到S3时,应该在网络浏览器中打开,您需要设置正确的内容类型。当 S3 为您的 object 提供服务时,您设置的内容类型将作为 HTTP header.
发送
Web 浏览器使用 MIME types 来确定如何处理 URL,而不是文件扩展名。
在您的情况下,您传递给 s3.upload
的参数中缺少内容类型。而且,密钥不正确。
应该是:
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)
};
我正在尝试从邮递员上传图像 (base64),当我点击无服务器时我可以看到 API,S3 存储桶中添加了一些东西但没有图像,我正在使用 nodejs Lambda 函数,我尝试了很多解决方案但没有成功。请告诉我哪里错了:
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
}
}
请让我知道我遗漏了一些代码。我们将不胜感激。
将objects上传到S3时,应该在网络浏览器中打开,您需要设置正确的内容类型。当 S3 为您的 object 提供服务时,您设置的内容类型将作为 HTTP header.
发送Web 浏览器使用 MIME types 来确定如何处理 URL,而不是文件扩展名。
在您的情况下,您传递给 s3.upload
的参数中缺少内容类型。而且,密钥不正确。
应该是:
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)
};