【问题标题】:Resizing images with sharp before uploading to google cloud storage在上传到谷歌云存储之前用锐利调整图像大小
【发布时间】:2021-10-25 15:12:38
【问题描述】:

我尝试在上传到谷歌云存储之前调整图像大小或压缩图像。 上传工作正常,但调整大小似乎不起作用。

这是我的代码:

const uploadImage = async (file) => new Promise((resolve, reject) => {
    let { originalname, buffer } = file
    sharp(buffer)
        .resize(1800, 948)
        .toFormat("jpeg")
        .jpeg({ quality: 80 })
        .toBuffer()


    const blob = bucket.file(originalname.replace(/ /g, "_"))
    const blobStream = blob.createWriteStream({
        resumable: false
    })
    blobStream.on('finish', () => {
        const publicUrl = format(
            `https://storage.googleapis.com/${bucket.name}/${blob.name}`
        )
        resolve(publicUrl)
    }).on('error', () => {
            reject(`Unable to upload image, something went wrong`)
        })
        .end(buffer)
}) 

【问题讨论】:

  • toBuffer() 似乎正在返回一个承诺。尝试在 promise new Promise(async (resolve, reject) 中添加 async 并在此处等待 let { originalname, buffer } = await file...

标签: javascript node.js express google-cloud-storage sharp


【解决方案1】:

我在进行的一个项目中遇到了同样的问题。经过大量试验和错误,我找到了以下解决方案。它可能不是最优雅的,但它对我有用。

在我的上传路由函数中,我使用原始文件值创建了一个新的缩略图对象,并将其作为文件参数传递给谷歌云存储的 uploadFile 函数。

在我的上传图片路由函数里面:

const file = req.file;

const thumbnail = {
  fieldname: file.fieldname,
  originalname: `thumbnail_${file.originalname}`,
  encoding: file.encoding,
  mimetype: file.mimetype,
  buffer: await sharp(file.buffer).resize({ width: 150 }).toBuffer()
}

const uploadThumbnail = await uploadFile(thumbnail);

我的google云存储上传文件功能:

const uploadFile = async (file) => new Promise((resolve, reject) => {

  const gcsname = file.originalname;
  const bucketFile = bucket.file(gcsname);

  const stream = bucketFile.createWriteStream({
    resumable: false,
    metadata: {
      contentType: file.mimetype
    }
  });

  stream.on('error', (err) => {
    reject(err);
  });

  stream.on('finish', (res) => {
    resolve({ 
      name: gcsname
    });
  });

  stream.end(file.buffer);
});

【讨论】:

    【解决方案2】:

    我认为问题出在toFormat()。该功能在文档中不存在。您可以尝试删除它并检查它是否有效?

    sharp(buffer)
      .resize(1800, 948)
      .jpeg({ quality: 80 })
      .toBuffer()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 2021-12-07
      • 2017-04-27
      • 1970-01-01
      • 2021-10-07
      • 2021-10-26
      • 2016-12-22
      • 2015-02-28
      相关资源
      最近更新 更多