当前位置:首页 > JavaScript

js 实现上传图片预览

2026-03-01 00:46:05JavaScript

使用 FileReader API 实现图片预览

通过 FileReader 读取用户选择的图片文件,并将其转换为 Base64 或 Data URL,直接赋值给 <img> 标签的 src 属性。

<input type="file" id="fileInput" accept="image/*">
<img id="preview" src="#" alt="Preview">

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

    const reader = new FileReader();
    reader.onload = function(event) {
      document.getElementById('preview').src = event.target.result;
    };
    reader.readAsDataURL(file);
  });
</script>

使用 URL.createObjectURL 实现预览

通过 URL.createObjectURL 创建临时对象 URL,适合大文件预览,性能更好但需手动释放内存。

<input type="file" id="fileInput" accept="image/*">
<img id="preview" src="#" alt="Preview">

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

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

    // 清理内存(可选,在不需要时调用)
    // URL.revokeObjectURL(objectURL);
  });
</script>

多图片预览实现

通过循环处理多个文件,结合 document.createElement 动态生成预览区域。

<input type="file" id="fileInput" multiple accept="image/*">
<div id="previewContainer"></div>

<script>
  document.getElementById('fileInput').addEventListener('change', function(e) {
    const files = e.target.files;
    const previewContainer = document.getElementById('previewContainer');
    previewContainer.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.height = '100px';
        previewContainer.appendChild(img);
      };
      reader.readAsDataURL(file);
    });
  });
</script>

图片尺寸限制与压缩

通过 canvas 实现图片压缩和尺寸调整,适合需要控制图片质量的场景。

function compressImage(file, maxWidth, maxHeight, quality) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = function(event) {
      const img = new Image();
      img.onload = function() {
        const canvas = document.createElement('canvas');
        let width = img.width;
        let height = img.height;

        if (width > maxWidth) {
          height = Math.round((height * maxWidth) / width);
          width = maxWidth;
        }
        if (height > maxHeight) {
          width = Math.round((width * maxHeight) / height);
          height = maxHeight;
        }

        canvas.width = width;
        canvas.height = height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0, width, height);

        resolve(canvas.toDataURL('image/jpeg', quality));
      };
      img.src = event.target.result;
    };
    reader.readAsDataURL(file);
  });
}

// 使用示例
document.getElementById('fileInput').addEventListener('change', async function(e) {
  const file = e.target.files[0];
  if (!file) return;

  const compressedDataUrl = await compressImage(file, 800, 800, 0.7);
  document.getElementById('preview').src = compressedDataUrl;
});

兼容性处理与注意事项

  • 旧版浏览器可能需要 polyfill 支持 FileReader API
  • 移动端部分设备可能存在拍照旋转问题,需通过 EXIF 信息校正
  • 大文件预览建议使用 URL.createObjectURL 避免内存问题
  • 上传前应验证文件类型(通过 file.type 或文件头校验)

js 实现上传图片预览

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

相关文章

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整…

js 实现链表

js 实现链表

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

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div c…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Bas…