使用Sharp调整图像大小后上传到Google Cloud Storage

3
我尝试在上传至Google云存储之前调整大小或压缩图像。上传工作正常,但是调整大小似乎不起作用。
以下是我的代码:
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)
}) 

2
toBuffer() seems to be returning a promise. Try adding async in the promise new Promise(async (resolve, reject) and await in here let { originalname, buffer } = await file... - Dharmaraj
3个回答

3

我曾遇到同样的问题,当时我在处理一个项目。经过多次尝试和错误,我找到了以下解决方案。这可能不是最优雅的方法,但它对我起作用了。

在我的上传路由功能中,我创建了一个新的缩略图图像对象,使用原始文件值,并将其作为文件参数传递给用于 Google Cloud 存储的 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);

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

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);
});

0

我认为问题出在toFormat()函数上。该函数在文档中不存在。你能否尝试将其删除并检查是否可以正常工作?

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

0

上传完图片后修改元数据。

import * as admin from "firebase-admin";
import * as functions from "firebase-functions";
import { log } from "firebase-functions/logger";
import * as sharp from "sharp";

export const uploadFile = functions.https.onCall(async (data, context) => {
  const bytes = data.imageData;

  const bucket = admin.storage().bucket();

  const buffer = Buffer.from(bytes, "base64");

  const bufferSharp = await sharp(buffer)
    .png()
    .resize({ width: 500 })
    .toBuffer();

  const nombre = "IMAGE_NAME.png";

  const fileName = `img/${nombre}.png`;
  const fileUpload = bucket.file(fileName);

  const uploadStream = fileUpload.createWriteStream();

  uploadStream.on("error", async (err) => {
    log("Error uploading image", err);

    throw new functions.https.HttpsError("unknown", "Error uploading image");
  });

  uploadStream.on("finish", async () => {
    await fileUpload.setMetadata({ contentType: "image/png" });

    log("Upload success");
  });

  uploadStream.end(bufferSharp);
});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接