Skip to content
Snippets Groups Projects

GCS Image Uploader

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Dani Fithrantyo
    Edited
    gcs-image-uploader.js 3.26 KiB
    
    /**
     * Google Cloud Storage Image Uploader (Simplified)
     * 
     * This script uploads all images from a local folder to a Google Cloud Storage bucket
     * with a common prefix to simulate a folder structure.
     * 
     * Prerequisites:
     * - Node.js installed
     * - Google Cloud SDK configured or service account key available
     * - @google-cloud/storage package installed (npm install @google-cloud/storage)
     */
    
    const { Storage } = require('@google-cloud/storage');
    const fs = require('fs');
    const path = require('path');
    
    // Configuration - replace these values with your own
    const BUCKET_NAME = 'dev-banking-jago-partner';
    const PREFIX = 'temp-stockbit-ktp-images/'; // This simulates a folder in GCS (e.g., 'images/')
    const LOCAL_IMAGES_FOLDER = './stockbit-ktp'; // Path to your local images folder
    const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.tiff'];
    
    // Initialize Google Cloud Storage
    const storage = new Storage();
    const bucket = storage.bucket(BUCKET_NAME);
    
    /**
     * Checks if a file is an image based on its extension
     * @param {string} filePath - Path to the file
     * @returns {boolean} - True if the file is an image
     */
    function isImage(filePath) {
      const ext = path.extname(filePath).toLowerCase();
      return IMAGE_EXTENSIONS.includes(ext);
    }
    
    /**
     * Uploads a file to Google Cloud Storage
     * @param {string} localFilePath - Path to the local file
     * @param {string} destinationFileName - Name to give the file in GCS
     */
    async function uploadFile(localFilePath, destinationFileName) {
      try {
        await bucket.upload(localFilePath, {
          destination: destinationFileName,
          // Optional: set metadata
          metadata: {
            cacheControl: 'public, max-age=31536000',
          },
        });
        console.log(`Uploaded ${localFilePath} to ${destinationFileName}`);
        return true;
      } catch (error) {
        console.error(`Error uploading ${localFilePath}:`, error);
        return false;
      }
    }
    
    /**
     * Main function to upload all images
     */
    async function uploadImagesToGcs() {
      console.log('Starting image upload process...');
      
      // Check if local folder exists
      if (!fs.existsSync(LOCAL_IMAGES_FOLDER)) {
        console.error(`Local folder ${LOCAL_IMAGES_FOLDER} does not exist!`);
        return;
      }
      
      // Read all files from local folder
      const files = fs.readdirSync(LOCAL_IMAGES_FOLDER);
      const imageFiles = files.filter(file => 
        isImage(file) && fs.statSync(path.join(LOCAL_IMAGES_FOLDER, file)).isFile()
      );
      
      console.log(`Found ${imageFiles.length} images to upload`);
      
      if (imageFiles.length === 0) {
        console.log('No images found to upload. Make sure your local folder contains image files.');
        return;
      }
      
      // Upload each image
      const uploadPromises = imageFiles.map(file => {
        const localFilePath = path.join(LOCAL_IMAGES_FOLDER, file);
        const destinationPath = `${PREFIX}${file}`;
        return uploadFile(localFilePath, destinationPath);
      });
      
      // Wait for all uploads to complete
      const results = await Promise.all(uploadPromises);
      
      // Count successes
      const successCount = results.filter(result => result).length;
      console.log(`Upload complete. Successfully uploaded ${successCount} of ${imageFiles.length} images.`);
    }
    
    // Execute the main function
    uploadImagesToGcs().catch(err => {
      console.error('Unhandled error in upload process:', err);
    });
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment