【问题标题】:Sharp Error: Input buffer contains unsupported image format尖锐错误:输入缓冲区包含不支持的图像格式
【发布时间】: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 发送参数

标签: node.js amazon-s3 sharp


【解决方案1】:

我找到了解决办法。

const getImage = (req, res, next) => {
    const w = parseInt(req.params.w)
    const readStream = s3
        .getObject({
            Bucket: process.env.UPLOAD_BUCKET_NAME,
            Key: 'test.jpg'
        })
        .createReadStream()

    const transformer = (w) => sharp().resize(w)
    pipeline(readStream, transformer(w), res, (err) => {
        if (err) {
            next(err)
        }
    })
}
export default getImage

之所以如此,是因为它的范围不限于请求。

【讨论】:

  • 这在某种程度上暗示您只是编写了一个错误的中间件签名,查看了它,实现了它,并修复了它,而此处在技术上不需要 stackoverflow。在这些情况下,最好再次删除您的问题。
  • 我把这个问题留给那些可能面临同样问题的人,然后他们可以通过研究解决方案来解决这个问题。@Mike'Pomax'Kamermans
  • 这很好,只要您意识到您自己解决的任何问题,因为您实际上忘记阅读文档(以便您的函数使用正确的签名)意味着这不是一个编程问题,但实际上只是一个错字,这是现在关闭问题的政策之一。其他人,比如你,应该至少验证他们的代码是否遵循他们使用的 API,在这种情况下你没有,然后你检查,然后你自己纠正。这不是“答案”可以帮助其他人的东西。他们也应该这样做。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2021-03-18
  • 2020-06-22
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多