当前位置:首页 > 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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…