当前位置:首页 > JavaScript

js 实现上传图片预览

2026-01-30 09:41:13JavaScript

使用 FileReader 实现图片预览

通过 FileReader 对象的 readAsDataURL 方法可以将图片文件转换为 base64 编码,直接在页面上显示预览。

const input = document.getElementById('file-input');
const preview = document.getElementById('preview');

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

  const reader = new FileReader();
  reader.onload = function(event) {
    preview.src = event.target.result;
  };
  reader.readAsDataURL(file);
});

使用 URL.createObjectURL 实现图片预览

URL.createObjectURL 方法可以创建一个指向文件对象的临时 URL,适合显示大文件预览,性能优于 FileReader。

const input = document.getElementById('file-input');
const preview = document.getElementById('preview');

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

  const objectURL = URL.createObjectURL(file);
  preview.src = objectURL;

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

多图片预览实现

对于多文件上传的情况,可以通过循环处理每个文件并生成预览。

const input = document.getElementById('multi-file-input');
const previewContainer = document.getElementById('preview-container');

input.addEventListener('change', function(e) {
  previewContainer.innerHTML = '';
  const files = e.target.files;

  Array.from(files).forEach(file => {
    if (!file.type.match('image.*')) return;

    const reader = new FileReader();
    reader.onload = function(event) {
      const img = document.createElement('img');
      img.src = event.target.result;
      img.style.maxWidth = '200px';
      img.style.maxHeight = '200px';
      previewContainer.appendChild(img);
    };
    reader.readAsDataURL(file);
  });
});

拖放上传预览实现

通过 HTML5 的拖放 API 可以实现更友好的图片上传预览体验。

const dropArea = document.getElementById('drop-area');
const preview = document.getElementById('preview');

dropArea.addEventListener('dragover', function(e) {
  e.preventDefault();
  dropArea.classList.add('dragover');
});

dropArea.addEventListener('dragleave', function() {
  dropArea.classList.remove('dragover');
});

dropArea.addEventListener('drop', function(e) {
  e.preventDefault();
  dropArea.classList.remove('dragover');

  const file = e.dataTransfer.files[0];
  if (!file.type.match('image.*')) return;

  const reader = new FileReader();
  reader.onload = function(event) {
    preview.src = event.target.result;
  };
  reader.readAsDataURL(file);
});

图片预览样式优化

为预览图片添加样式可以提升用户体验,以下是一些常见样式建议:

#preview {
  max-width: 300px;
  max-height: 300px;
  border: 1px dashed #ccc;
  margin-top: 10px;
  display: none;
}

#preview.visible {
  display: block;
}

#drop-area {
  border: 2px dashed #ccc;
  padding: 20px;
  text-align: center;
}

#drop-area.dragover {
  border-color: #666;
  background-color: #f0f0f0;
}

兼容性处理

考虑旧版本浏览器的兼容性,可以添加特性检测和回退方案。

if (window.FileReader) {
  // 使用 FileReader 实现
} else if (window.URL && window.URL.createObjectURL) {
  // 使用 createObjectURL 实现
} else {
  alert('您的浏览器不支持图片预览功能');
}

图片验证和限制

在上传前对图片进行验证,确保符合要求。

js 实现上传图片预览

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

  // 检查文件类型
  if (!file.type.match('image.*')) {
    alert('请选择图片文件');
    return;
  }

  // 检查文件大小 (2MB)
  if (file.size > 2 * 1024 * 1024) {
    alert('图片大小不能超过2MB');
    return;
  }

  // 继续预览处理
});

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

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…