当前位置:首页 > 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 实现图片压缩和尺寸调整,适合需要控制图片质量的场景。

js 实现上传图片预览

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实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现密码

js实现密码

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

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…