当前位置:首页 > JavaScript

js实现上传图片预览

2026-02-28 23:09:11JavaScript

使用 FileReader 实现图片预览

通过 FileReader 对象读取用户选择的图片文件,转换为 Data URL 后显示在页面上。

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(e) {
    preview.src = e.target.result;
  };
  reader.readAsDataURL(file);
});

HTML 部分需要包含文件输入和图片元素:

<input type="file" id="file-input" accept="image/*">
<img id="preview" src="#" alt="Preview" style="max-width: 300px; display: none;">

使用 URL.createObjectURL 实现预览

这种方法通过创建对象 URL 来实现预览,性能更好但需要手动释放内存。

js实现上传图片预览

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.style.display = 'block';

  // 记得在不需要时释放内存
  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(e) {
      const img = document.createElement('img');
      img.src = e.target.result;
      img.style.maxWidth = '200px';
      img.style.margin = '5px';
      previewContainer.appendChild(img);
    };
    reader.readAsDataURL(file);
  });
});

HTML 部分:

js实现上传图片预览

<input type="file" id="multi-file-input" accept="image/*" multiple>
<div id="preview-container"></div>

使用 Canvas 压缩图片预览

在预览时对图片进行压缩处理,适合大图片文件。

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

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

  const reader = new FileReader();
  reader.onload = function(e) {
    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);

      preview.src = canvas.toDataURL('image/jpeg', 0.7);
      preview.style.display = 'block';
    };
    img.src = e.target.result;
  };
  reader.readAsDataURL(file);
});

拖放上传预览实现

通过拖放区域实现图片上传和预览。

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

// 防止默认拖放行为
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, preventDefaults, false);
});

function preventDefaults(e) {
  e.preventDefault();
  e.stopPropagation();
}

// 高亮拖放区域
['dragenter', 'dragover'].forEach(eventName => {
  dropArea.addEventListener(eventName, highlight, false);
});

['dragleave', 'drop'].forEach(eventName => {
  dropArea.addEventListener(eventName, unhighlight, false);
});

function highlight() {
  dropArea.classList.add('highlight');
}

function unhighlight() {
  dropArea.classList.remove('highlight');
}

// 处理拖放文件
dropArea.addEventListener('drop', handleDrop, false);

function handleDrop(e) {
  const dt = e.dataTransfer;
  const files = dt.files;

  if (files.length) {
    const file = files[0];
    if (file.type.match('image.*')) {
      const reader = new FileReader();
      reader.onload = function(e) {
        preview.src = e.target.result;
        preview.style.display = 'block';
      };
      reader.readAsDataURL(file);
    }
  }
}

HTML 和 CSS 部分:

<div id="drop-area">
  <p>拖放图片文件到这里</p>
  <img id="drop-preview" src="#" alt="Preview" style="max-width: 300px; display: none;">
</div>

<style>
  #drop-area {
    border: 2px dashed #ccc;
    padding: 20px;
    text-align: center;
  }
  #drop-area.highlight {
    border-color: #06f;
    background-color: #eef;
  }
</style>

这些方法涵盖了常见的图片预览需求,可以根据具体场景选择适合的实现方式。

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

相关文章

js实现继承

js实现继承

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

js实现tab选项卡切换

js实现tab选项卡切换

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

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…