【发布时间】:2020-11-30 15:16:53
【问题描述】:
我想对从 AWS S3 获取的图像创建图像操作,并希望对其执行操作操作。我正在使用流来解决加载大文件的问题。
import AWS from 'aws-sdk'
import sharp from 'sharp'
const s3 = new AWS.S3()
const transformer = (w, res, next) =>
sharp()
.resize(w)
.on('data', (data) => {
console.log(data)
res.write(data, 'binary')
})
.on('error', (err) => next(err))
.on('end', () => {
console.log('finished')
res.status(200).end()
})
const readStream = s3
.getObject({
Bucket: process.env.UPLOAD_BUCKET_NAME,
Key: 'test.jpg'
// Key: `${req.uid.uid}/${req.param('img')}`
})
.createReadStream()
const getImage = (w, res, next) => {
readStream.pipe(transformer(w, res, next))
readStream.on('error', (err) => next(err))
}
export default getImage
我在路由上调用getImage方法,这个函数第一次提供图像,但是当第二次请求图像时,它抛出错误:输入缓冲区包含不支持的图像格式
【问题讨论】:
-
听起来很清楚:即使 filename 声称它是
.jpg,但这并不意味着它是 jpeg 图像。检查流:它实际上是一个图像,还是您只是假设它是,它实际上是您在请求不存在的资源时得到的错误输出? -
@Mike'Pomax'Kamermans 但是如果你第一次请求快速路线,那么它会显示被操纵的图像。它只会在第二个和后续请求中引发错误。
-
很酷,但是 express 的中间件采用
(req, res, next)的形式,而不是(w, res, next),所以你没有在这里展示整个故事。如果您不使用 express,请记住说出您正在使用的内容。 -
路由器正在获取 (req, res, next) 并从那里执行功能并从 req 发送参数