Intenté cambiar el tamaño o comprimir una imagen antes de cargarla en el almacenamiento en la nube de Google. La carga funciona bien, pero el cambio de tamaño no parece funcionar.
Aquí está mi código:
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) })Me encontré con el mismo problema con un proyecto en el que estaba trabajando. Después de muchas pruebas y errores, encontré la siguiente solución. Puede que no sea el más elegante, pero funcionó para mí.
En mi función de ruta de carga, creé un nuevo objeto de imagen en miniatura con los valores del archivo original y lo pasé como parámetro de archivo a la función uploadFile para el almacenamiento en la nube de Google.
Dentro de mi función de ruta de carga de imágenes:
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);Mi función de archivo de carga de almacenamiento en la nube de 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); });Creo que el problema es con toFormat() . Esa función no existe en los Docs. ¿Puedes intentar quitarlo y comprobar si funciona?
sharp(buffer) .resize(1800, 948) .jpeg({ quality: 80 }) .toBuffer()