Image Upload & Thumbnails Tutorial · Module 05 of 11

Image Metadata & EXIF

Extract image dimensions, color space, format, and EXIF data (location, camera info, timestamp). Store metadata in database for search and filtering. Strip sensitive EXIF data before storage. By the end, images have rich metadata for display and discovery.

~2–3 hrsBeginnerMetadata focus
← Back to Module 05 overview
What You'll Have at the End

Definition of Done

  • Extract image width, height, format, color profile using Sharp.
  • Extract EXIF data (camera model, timestamp, location) using exifparser or piexifjs.
  • Store core metadata in images table: width, height, format, upload_timestamp.
  • Store rich EXIF in JSONB column: camera, focal_length, location.
  • Strip sensitive EXIF before storage (GPS, embedded thumbnails).
  • GET /images/:id returns dimensions and metadata.
  • Ability to query by upload date or dimensions.
The Steps

Build It

STEP 1

Extract and store image metadata

Install: npm install exifparser

Create src/utils/metadataExtractor.ts:

import sharp from 'sharp';
import ExifParser from 'exifparser';

export async function extractMetadata(buffer: Buffer) {
  const sharpImage = sharp(buffer);
  const metadata = await sharpImage.metadata();

  let exif = {};
  try {
    const parser = ExifParser.create(buffer);
    const result = parser.parse();
    exif = {
      camera: result.tags.Model || result.tags.Make,
      timestamp: result.tags.DateTime,
      focal_length: result.tags.FocalLength,
      iso: result.tags.ISOSpeedRatings,
      aperture: result.tags.FNumber
    };
  } catch (err) {
    // No EXIF data
  }

  return {
    width: metadata.width,
    height: metadata.height,
    format: metadata.format,
    colorspace: metadata.space,
    hasAlpha: metadata.hasAlpha,
    exif
  };
}