1

I'm writing code on image upload function to google cloud. I'm able to upload image to gcloud but not able resize it before uploading. I tried with node js sharp library to resize but not able to implement it properly. Here is my code below:

My Upload function

const processFile = require('../middleware/upload')
const { format } = require('util')
const { Storage } = require('@google-cloud/storage')
// Instantiate a storage client with credentials
const storage = new Storage({ keyFilename: 'xxxxx.json' })
const bucket = storage.bucket('<---bucket name--->')

const upload = async (req, res) => {
    try {
        await processFile(req, res)

        if (!req.file) {
            return res.status(400).send({ message: 'Please upload a file!' })
        }

        // Create a new blob in the bucket and upload the file data.
        const blob = bucket.file(req.file.originalname.replace(/ /g, "_"))
        const blobStream = blob.createWriteStream({
            resumable: false,
        })

        blobStream.on('error', (err) => {
            res.status(500).send({ message: err.message })
        })

        blobStream.on('finish', async (data) => {
            // Create URL for directly file access via HTTP.
            const publicUrl = format(
                `https://storage.googleapis.com/${bucket.name}/${blob.name}`,
            )

            try {
                // Make the file public
                await bucket.file(req.file.originalname).makePublic()
            } catch {
                return res.status(500).send({
                    message: `Uploaded the file successfully: ${req.file.originalname}, but public access is denied!`,
                    url: publicUrl,
                })
            }

            res.status(200).send({
                message: 'Uploaded the file successfully: ' + req.file.originalname,
                url: publicUrl,
            })
        })

        blobStream.end(req.file.buffer)
    } catch (err) {
        if (err.code == "LIMIT_FILE_SIZE") {
            return res.status(500).send({
              message: "File size cannot be larger than 2MB!",
            });
        }
        res.status(500).send({
            message: `Could not upload the file: ${req.file.originalname}. ${err}`,
        })
    }
}

module.exports = {
  upload
}

My Multer lib

const processFile = require('../middleware/upload')

const util = require("util");
const Multer = require("multer");
const maxSize = 2 * 1024 * 1024;

let processFile = Multer({
    storage: Multer.memoryStorage(),
    limits: { fileSize: maxSize },
}).single("file");

let processFileMiddleware = util.promisify(processFile);
module.exports = processFileMiddleware;

The above code is able to push image to gcloud. Can someone please suggest how to resize it with node js sharp and upload to gcloud. Thank you in advance

David
  • 539
  • 3
  • 9
  • 23
  • Does this answer your question? [Node.js: image resizing without ImageMagick](https://stackoverflow.com/questions/24026320/node-js-image-resizing-without-imagemagick) – Yogi Nov 21 '22 at 08:36

1 Answers1

0

When you get your req file in Nodejs using multer, use that file to size by converting it into inputBuffer and upload it.

sharp(inputBuffer)
.resize(200, 200)
.toFile('ouput.jpg', function(err) {});

For Converting image to image buffer, follow this link Convert Image to Image Buffer using js

For more details, about resizing you can follow this link Resizing Image in Nodejs

Sahil Verma
  • 61
  • 1
  • 5