当前位置:首页 > JavaScript

js实现上传图片预览

2026-04-03 23:36:45JavaScript

使用FileReader实现图片预览

通过FileReader对象读取用户选择的图片文件,并将其显示在页面上。HTML部分需要包含一个文件输入框和一个用于显示预览的img元素。

<input type="file" id="upload" accept="image/*">
<img id="preview" src="#" alt="预览图" style="max-width: 300px; display: none;">
document.getElementById('upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const reader = new FileReader();
  reader.onload = function(event) {
    const preview = document.getElementById('preview');
    preview.src = event.target.result;
    preview.style.display = 'block';
  };
  reader.readAsDataURL(file);
});

使用URL.createObjectURL实现预览

这种方法性能更好,不需要等待文件完全读取就能创建预览,但需要手动释放内存。

js实现上传图片预览

document.getElementById('upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const preview = document.getElementById('preview');
  const objectURL = URL.createObjectURL(file);
  preview.src = objectURL;
  preview.style.display = 'block';

  // 记得在不需要时释放内存
  preview.onload = function() {
    URL.revokeObjectURL(objectURL);
  };
});

多图片预览实现

如果需要预览多个图片,可以循环处理文件列表并动态创建预览元素。

js实现上传图片预览

<input type="file" id="multi-upload" accept="image/*" multiple>
<div id="preview-container"></div>
document.getElementById('multi-upload').addEventListener('change', function(e) {
  const files = e.target.files;
  const container = document.getElementById('preview-container');
  container.innerHTML = '';

  Array.from(files).forEach(file => {
    const reader = new FileReader();
    reader.onload = function(event) {
      const img = document.createElement('img');
      img.src = event.target.result;
      img.style.maxWidth = '200px';
      img.style.margin = '5px';
      container.appendChild(img);
    };
    reader.readAsDataURL(file);
  });
});

预览前验证图片尺寸

在上传前可以验证图片的宽度和高度是否符合要求。

document.getElementById('upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const img = new Image();
  img.onload = function() {
    if (this.width > 1024 || this.height > 1024) {
      alert('图片尺寸不能超过1024x1024像素');
      return;
    }

    const preview = document.getElementById('preview');
    preview.src = URL.createObjectURL(file);
    preview.style.display = 'block';
  };
  img.src = URL.createObjectURL(file);
});

使用canvas压缩图片预览

对于大图片,可以使用canvas进行压缩后再显示预览。

document.getElementById('upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const img = new Image();
  img.onload = function() {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');

    // 设置最大尺寸
    const MAX_WIDTH = 800;
    const MAX_HEIGHT = 800;
    let width = img.width;
    let height = img.height;

    if (width > height) {
      if (width > MAX_WIDTH) {
        height *= MAX_WIDTH / width;
        width = MAX_WIDTH;
      }
    } else {
      if (height > MAX_HEIGHT) {
        width *= MAX_HEIGHT / height;
        height = MAX_HEIGHT;
      }
    }

    canvas.width = width;
    canvas.height = height;
    ctx.drawImage(img, 0, 0, width, height);

    const preview = document.getElementById('preview');
    preview.src = canvas.toDataURL('image/jpeg', 0.7);
    preview.style.display = 'block';
  };
  img.src = URL.createObjectURL(file);
});

标签: 上传图片js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…