webdevpuneet.com

Bootstrap Paste-to-Upload: Clipboard Image Snippet

Bootstrap Paste-to-Upload (Clipboard Image Paste) · Forms · Plain HTML, CSS & JS · Live preview

CategoryForms

Copy & paste

Source Code

<div class="bspaste-page">
  <div class="card bspaste-card">
    <div class="card-body p-4">
      <div class="d-flex align-items-center gap-3 mb-3">
        <span class="bspaste-badge-icon" aria-hidden="true">
          <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="4" width="14" height="17" rx="2"/><path d="M9 4V3h6v1"/><path d="M9 14l2.5-2.5L14 14l2-2"/></svg>
        </span>
        <div>
          <h6 class="mb-0 fw-bold">Attach a screenshot</h6>
          <div class="small text-muted">Paste straight from your clipboard</div>
        </div>
      </div>

      <div class="bspaste-zone" id="bspasteZone" tabindex="0" aria-label="Paste an image here">
        <div id="bspasteEmpty">
          <div class="bspaste-ready" aria-hidden="true">Ready &mdash; press paste now</div>
          <p class="fw-semibold mb-2">Click here, then paste</p>
          <p class="mb-3"><kbd id="bspasteKey">Ctrl</kbd> <span class="text-muted">+</span> <kbd>V</kbd></p>
          <button type="button" class="btn btn-sm btn-light border" id="bspasteBrowse">or browse files</button>
          <input type="file" id="bspasteFile" accept="image/*" hidden>
        </div>
        <div class="d-none" id="bspastePreviewWrap">
          <img id="bspastePreview" alt="Pasted image preview">
          <div class="d-flex justify-content-center gap-2 mt-3" id="bspasteMeta"></div>
        </div>
      </div>

      <div class="progress mt-3 d-none" id="bspasteProgress" role="progressbar" aria-label="Upload progress" style="height:8px">
        <div class="progress-bar bg-primary" id="bspasteBar" style="width:0%"></div>
      </div>
      <p class="small text-muted mt-2 mb-0" id="bspasteStatus" aria-live="polite">&nbsp;</p>

      <div class="d-flex gap-2 mt-3 d-none" id="bspasteActions">
        <button type="button" class="btn btn-outline-secondary flex-fill" id="bspasteRemove">Remove</button>
        <button type="button" class="btn btn-primary flex-fill" id="bspasteUpload">Upload</button>
      </div>
    </div>
  </div>
</div>

Extend with AI

Take This Snippet Further With AI

The AI prompt for this one is for Patreon supporters ($3 a month), along with a site with no ads. Supporters enter the passcode once and it is remembered in this browser.

· Become a supporter

What's included

Features

Polished Bootstrap card with an icon header, keyboard-key hints (⌘ on Mac, Ctrl elsewhere) and a pulsing "ready" pill when focused
Preview shows image format, pixel dimensions and file size as badges
Upload button with a Bootstrap progress bar and a clear "Uploaded" state, ready to swap for a real fetch call
"Or browse files" fallback for touch devices where clipboard image paste is unreliable
Image type and 5 MB size checks with inline error messages
Reads a real image directly from the browser's ClipboardEvent, no file picker required
The drop zone is genuinely focusable (tabindex="0"), which is what makes it a valid paste target at all
Explicitly detects and reports clipboard content with no image, instead of failing silently
The previous object URL is revoked before a new one is created, so repeated pastes never leak memory
Remove fully resets the preview and clipboard object URL, ready for another paste immediately

About this UI Snippet

Bootstrap Paste-to-Upload (Clipboard Image Paste) — HTML, CSS & JavaScript

Screenshot of the Bootstrap Paste-to-Upload (Clipboard Image Paste) snippet rendered live

Pasting only works because the drop zone is a real, focusable element — tabindex="0" gives it something a drag-and-drop-only zone lacks: the ability to actually receive keyboard focus, which is a prerequisite for a paste event to ever fire on it at all. Clicking the zone focuses it, and only then does Ctrl+V/Cmd+V dispatch a genuine ClipboardEvent the listener can read from.

The listener reads e.clipboardData.items, finds the first item whose type starts with image/, and calls .getAsFile() to get a real Blob — this correctly ignores a clipboard holding plain copied text (which has no matching item) with an explicit, honest message rather than silently doing nothing or throwing an error.

showImage() revokes any previous object URL with URL.revokeObjectURL(currentUrl) before creating a new one, specifically so pasting a second image doesn't leak the first image's URL — the same object-URL cleanup discipline this collection's bootstrap-image-upload-preview applies per-thumbnail, applied here to a single always-current preview instead of a list.

Step by step

How to Use

  1. 1
    Copy any imageTake a screenshot, or copy an image from another app or webpage, onto your system clipboard.
  2. 2
    Click the dashed paste zone on this pageIt focuses with a highlighted border and a "Ready — press paste now" pill.
  3. 3
    Press Ctrl+V (or Cmd+V on Mac)The pasted image appears as a preview with badges for its format, pixel dimensions and size in KB.
  4. 4
    Try pasting plain copied text insteadA clear message explains no image was found, rather than doing nothing silently.
  5. 5
    Click "Upload"A Bootstrap progress bar fills and the button confirms "Uploaded". This is a demo timer; swap it for a fetch POST.
  6. 6
    Click "Remove"The preview clears, its object URL is released, and the zone returns to its empty, focused state ready for another paste.

Real-world uses

Common Use Cases

DEV
Bug report and support ticket forms
Pasting a screenshot directly is dramatically faster than saving it to disk first and browsing to it — pairs with bootstrap-file-upload-drag-drop as an alternate input method.
Design feedback and annotation tools
A natural fit anywhere a user is likely to already have a screenshot on their clipboard mid-workflow.
Chat and comment boxes accepting image attachments
Lets a user paste an image straight into a message the same way many chat apps already support.

Got questions?

Frequently Asked Questions

Only a focused, focusable element receives a paste event through the standard clipboard shortcut — without tabindex, a plain div can never gain keyboard focus, so Ctrl+V would have nowhere to dispatch its ClipboardEvent to.

The items array is searched for an entry whose type starts with "image/"; when none is found, the zone shows an explicit "no image found" message instead of silently ignoring the paste or throwing an error.

Clipboard paste support for images varies significantly across mobile browsers and is generally less reliable than on desktop. That is why the zone includes an "or browse files" button backed by a normal file input.

The Upload button runs a demo timer. Replace it with a FormData containing the pasted Blob and send it with fetch (or XMLHttpRequest if you need real progress events), then drive the progress bar from the result.

Yes. Attach the paste listener to a ref'd element in a mount hook, store the object URL in component state (revoking the previous one in the same setter, e.g. inside a state updater callback), and clean up on unmount to avoid a leaked URL if the component unmounts mid-preview.

Design your website