当前位置:首页 > JavaScript

js 实现上传图片预览

2026-03-01 00:46:05JavaScript

使用 FileReader API 实现图片预览

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

js 实现上传图片预览

<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,适合大文件预览,性能更好但需手动释放内存。

js 实现上传图片预览

<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实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…