Working with Data URIs in JavaScript

Generate, manipulate, and decode data URIs programmatically with JavaScript. Use FileReader, Canvas, Blob, and fetch APIs for data URI operations.

JavaScript

Detailed Explanation

JavaScript Data URI APIs

JavaScript provides several native APIs for working with data URIs: FileReader for generating them from files, Canvas for creating them from graphics, and the Fetch API for converting between data URIs and Blobs.

Generating Data URIs from Files

function fileToDataUri(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });
}

// Usage with file input
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
  const dataUri = await fileToDataUri(e.target.files[0]);
  console.log(dataUri); // data:image/png;base64,...
});

Generating Data URIs from Canvas

const canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 100;
const ctx = canvas.getContext('2d');

// Draw something
ctx.fillStyle = '#3b82f6';
ctx.fillRect(0, 0, 100, 100);
ctx.fillStyle = '#ffffff';
ctx.font = '40px sans-serif';
ctx.fillText('Hi', 25, 60);

// Get data URI
const dataUri = canvas.toDataURL('image/png');
// Or with quality for JPEG:
const jpegUri = canvas.toDataURL('image/jpeg', 0.8);

Converting Data URI to Blob

async function dataUriToBlob(dataUri) {
  const response = await fetch(dataUri);
  return response.blob();
}

// Or without fetch:
function dataUriToBlobSync(dataUri) {
  const [header, data] = dataUri.split(',');
  const mime = header.match(/:(.*?);/)[1];
  const binary = atob(data);
  const array = new Uint8Array(binary.length);
  for (let i = 0; i < binary.length; i++) {
    array[i] = binary.charCodeAt(i);
  }
  return new Blob([array], { type: mime });
}

Converting Text to Data URI

function textToDataUri(text, mimeType = 'text/plain') {
  const base64 = btoa(unescape(encodeURIComponent(text)));
  return \`data:\${mimeType};base64,\${base64}\`;
}

// For SVG (percent-encoded, often smaller):
function svgToDataUri(svgString) {
  return 'data:image/svg+xml,' + encodeURIComponent(svgString);
}

Downloading Data URIs

function downloadDataUri(dataUri, filename) {
  const link = document.createElement('a');
  link.href = dataUri;
  link.download = filename;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

Framework Integration

In React, Vue, or Angular, data URIs work directly in template bindings:

// React
<img src={dataUri} alt="Dynamic image" />

// Dynamic favicon
useEffect(() => {
  const link = document.querySelector("link[rel='icon']");
  if (link) link.href = dataUri;
}, [dataUri]);

Use Case

You are building a browser-based image editor that generates thumbnails as data URIs for instant preview without server uploads, and needs to export the edited image as a downloadable file.

Try It — Data URL Generator & Decoder

Open full tool