¿Cómo cargar una imagen única/múltiple a cloudinary usando node.js?

Cloudinary es una solución integral de administración de imágenes y videos para sitios web y aplicaciones móviles, que cubre todo, desde la carga de imágenes y videos, el almacenamiento, las manipulaciones y las optimizaciones hasta la entrega.

Instalación:

  • Paso 1: Vaya al directorio del proyecto e inicialice el proyecto usando el siguiente comando en la terminal.

    npm init -y
  • Paso 2: instale los paquetes npm necesarios con el siguiente comando.

    npm install express multer cloudinary
  • Paso 3: Cree 2 archivos en el directorio del proyecto actual llamado index.js y public/index.html como se muestra en el directorio del proyecto a continuación.

Estructura del proyecto:

index.html: Básicamente contiene 2 formularios, es decir, carga de archivos individuales y múltiples.

index.html

<!DOCTYPE html>
<body style="padding: 30px;">
    <form method="POST" action="/profile-upload-single" 
          enctype="multipart/form-data">
        <div>
            <label>Upload profile picture</label>
            <input type="file" name="profile-file" required/>
        </div>
        <div>
            <input type="submit" value="Upload" />
        </div>
    </form>
      
    <br><hr><br>
  
    <form method="POST" action="/profile-upload-multiple" 
          enctype="multipart/form-data">
        <div>
            <label>Upload multiple profile picture</label>
            <input type="file" name="profile-files" required multiple  />
        </div>
        <div>
            <input type="submit" value="Upload" />
        </div>
    </form>
</body>
</html>

index.js: reemplace cloud_name , api_key , api_secret con sus credenciales de cloudinary que puede encontrar en el panel de control de cloudinary .

index.js

// Requiring module
const express = require("express");
const multer = require("multer");
const port = 3000;
const app = express();
const cloudinary = require("cloudinary").v2;
const bodyParser = require("body-parser");
const fs = require("fs");
  
// Creating uploads folder if not already present
// In "uploads" folder we will temporarily upload
// image before uploading to cloudinary
if (!fs.existsSync("./uploads")) {
    fs.mkdirSync("./uploads");
}
  
// Multer setup
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, "./uploads");
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname);
    },
});
  
var upload = multer({ storage: storage });
  
// Body parser configuration
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
  
app.use(express.static(__dirname + "/public"));
app.use("/uploads", express.static("uploads"));
  
// Cloudinary configuration
cloudinary.config({
    cloud_name: "YOUR_CLOUD_NAME",
    api_key: "YOUR_API_NAME",
    api_secret: "YOUR_API_SECRET",
});
  
async function uploadToCloudinary(locaFilePath) {
  
    // locaFilePath: path of image which was just
    // uploaded to "uploads" folder
  
    var mainFolderName = "main";
    // filePathOnCloudinary: path of image we want
    // to set when it is uploaded to cloudinary
    var filePathOnCloudinary = 
        mainFolderName + "/" + locaFilePath;
  
    return cloudinary.uploader
        .upload(locaFilePath, { public_id: filePathOnCloudinary })
        .then((result) => {
  
            // Image has been successfully uploaded on
            // cloudinary So we dont need local image 
            // file anymore
            // Remove file from local uploads folder
            fs.unlinkSync(locaFilePath);
  
            return {
                message: "Success",
                url: result.url,
            };
        })
        .catch((error) => {
  
            // Remove file from local uploads folder
            fs.unlinkSync(locaFilePath);
            return { message: "Fail" };
        });
}
  
function buildSuccessMsg(urlList) {
  
    // Building success msg to display on screen
    var response = `<h1>
                   <a href="/">Click to go to Home page</a><br>
                  </h1><hr>`;
  
    // Iterating over urls of images and creating basic
    // html to render images on screen
    for (var i = 0; i < urlList.length; i++) {
        response += "File uploaded successfully.<br><br>";
        response += `FILE URL: <a href="${urlList[i]}">
                    ${urlList[i]}</a>.<br><br>`;
        response += `<img src="${urlList[i]}" /><br><hr>`;
    }
  
    response += `<br>
<p>Now you can store this url in database or 
  // do anything with it  based on use case.</p>
`;
    return response;
}
  
app.post(
    "/profile-upload-single",
    upload.single("profile-file"),
    async (req, res, next) => {
  
        // req.file is the `profile-file` file
        // req.body will hold the text fields,
        // if there were any
  
        // req.file.path will have path of image
        // stored in uploads folder
        var locaFilePath = req.file.path;
  
        // Upload the local image to Cloudinary 
        // and get image url as response
        var result = await uploadToCloudinary(locaFilePath);
  
        // Generate html to display images on web page.
        var response = buildSuccessMsg([result.url]);
  
        return res.send(response);
    }
);
  
app.post(
    "/profile-upload-multiple",
    upload.array("profile-files", 12),
    async (req, res, next) => {
  
        // req.files is array of `profile-files` files
        // req.body will contain the text fields,
        // if there were any
        var imageUrlList = [];
  
        for (var i = 0; i < req.files.length; i++) {
            var locaFilePath = req.files[i].path;
  
            // Upload the local image to Cloudinary
            // and get image url as response
            var result = await uploadToCloudinary(locaFilePath);
            imageUrlList.push(result.url);
        }
  
        var response = buildSuccessMsg(imageUrlList);
  
        return res.send(response);
    }
);
  
app.listen(port, () => {
    console.log(`Server running on port ${port}!
            \nClick http://localhost:3000/`);
});

Pasos para ejecutar el programa:

node index.js

Salida: abra el navegador y visite http://localhost:3000 . Ahora podría ver los siguientes 2 formularios, es decir, carga de imágenes únicas y múltiples, como se muestra a continuación.

Referencias: https://cloudinary.com/documentation/node_integration .

Publicación traducida automáticamente

Artículo escrito por RUGVEDBONGALE y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *