图像预览,而不是下载AWS S3



我做了一个Node.js lambda服务,它只能上传.jpeg、.jpg和.png。使用multer和express现在过滤和其他一切都在工作。

我遇到的问题是,当文件已经上传时,我无法使用s3提供的链接从s3控制台预览它,而是直接下载图像。

这是代码:

const fileFilter = (req, file, cb) => {
let mimeType = file.mimetype;
const fileString = file.originalname;
let extension = path.extname(fileString);
if(mimeType == 'image/jpeg'){
if(extension == '.jpeg' || extension == '.jpg'){
cb(null, true)
} else {
cb("File extension does not match the mimetype, check the file is not corrupt" + " " + extension + " and " + mimeType, false)
}
} else if( mimeType == 'image/png'){
if(extension == '.png'){
cb(null, true)
} else {
cb("File extension does not match the mimetype, check the file is not corrupt" + " " + extension + " and " + mimeType, false)
}
} else {
cb("File type is not allowed" + " " + mimeType, false)
}
}
const multerS3Config = multerS3({
s3,
acl: 'public-read',
bucket: process.env.bucket,
ContentType: multerS3.AUTO_CONTENT_TYPE,
key: (req, file, cb) => {
const fileString = file.originalname;
const fileExtension = path.extname(fileString);
let idSha256 = crypto.createHash('sha256').update(fileString).digest("hex");
cb(null, `${idSha256}.${fileExtension}`);
}
})
const upload = multer({
storage: multerS3Config,
fileFilter: fileFilter,
limits:{
fileSize: 1024 * 512
}
}).single('photo')

service.post('/api/v1/images', (req, res) => {
upload(req, res, (err) => {
if (err) {
res.status(400).send(err)
} else {
res.status(200).send('Success')
}
})
});
module.exports.service = serverless(service);

这里是serverless.yml

service: image-upload
frameworkVersion: '2'
custom:
bucket: XXXXXXXXX
default_stage: dev
apigwBinary:
types:
- 'image/png'
- 'image/jpeg'
- 'image/jpg'

plugins:
- serverless-apigw-binary
- serverless-offline

provider:
name: aws
iamRoleStatements:
- Effect: 'Allow'
Action:
- 's3:PutObject'
- 's3:PutObjectAcl'
Resource: 'XXXXXXX'
runtime: nodejs12.x
profile: image_uploader
stage: ${opt:stage, self:custom.default_stage}
functions:
uploadS3File:
handler: handler.service
environment:
bucket: ${self:custom.bucket}-${self:provider.stage}
events:
- http:
path: /api/v1/images
method: post

因为正如我所读到的,它应该与multerS3对象上的ContentType属性一起工作,但到目前为止,运气不好。

如果您在代码中添加contentType之前在浏览器上打开了链接,并在代码中增加contentType后再次尝试打开它,它仍然会下载。

您有两个选项:-

  1. 上传新图像并在浏览器中打开链接

  2. 在隐身中打开相同的链接

这两个解决方案都应该有效,我遇到了同样的问题,这两个选项非常有效。

最新更新