元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…">
当前位置:首页 > JavaScript

js图片上传实现

2026-01-15 15:00:35JavaScript

图片上传的基本实现

使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/*"限制文件类型为图片:

<input type="file" id="uploader" accept="image/*">
<div id="preview"></div>

JavaScript部分通过FileReader读取并预览图片:

document.getElementById('uploader').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file.type.match('image.*')) return alert('请选择图片文件');

  const reader = new FileReader();
  reader.onload = function(e) {
    const img = document.createElement('img');
    img.src = e.target.result;
    document.getElementById('preview').appendChild(img);
  };
  reader.readAsDataURL(file);
});

多图上传与预览

通过添加multiple属性支持多文件选择,利用循环处理文件列表:

<input type="file" id="multiUploader" accept="image/*" multiple>
<div id="gallery"></div>

JavaScript处理逻辑:

document.getElementById('multiUploader').addEventListener('change', function(e) {
  const gallery = document.getElementById('gallery');
  gallery.innerHTML = '';

  Array.from(e.target.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.height = '100px';
      gallery.appendChild(img);
    };
    reader.readAsDataURL(file);
  });
});

图片压缩处理

使用Canvas API实现客户端图片压缩,减少上传流量消耗:

function compressImage(file, maxWidth = 800, quality = 0.7) {
  return new Promise((resolve) => {
    const img = new Image();
    img.src = URL.createObjectURL(file);

    img.onload = () => {
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');

      let width = img.width;
      let height = img.height;
      if (width > maxWidth) {
        height *= maxWidth / width;
        width = maxWidth;
      }

      canvas.width = width;
      canvas.height = height;
      ctx.drawImage(img, 0, 0, width, height);

      canvas.toBlob(resolve, 'image/jpeg', quality);
    };
  });
}

实际文件上传

通过FormData对象配合fetch或XMLHttpRequest实现文件上传:

async function uploadToServer(file) {
  const formData = new FormData();
  formData.append('image', file);

  try {
    const response = await fetch('/upload', {
      method: 'POST',
      body: formData
    });
    return await response.json();
  } catch (error) {
    console.error('上传失败:', error);
  }
}

进度显示与错误处理

XMLHttpRequest可提供上传进度监控:

function uploadWithProgress(file) {
  const xhr = new XMLHttpRequest();
  xhr.upload.onprogress = (e) => {
    const percent = Math.round((e.loaded / e.total) * 100);
    console.log(`上传进度: ${percent}%`);
  };

  xhr.onload = () => {
    if (xhr.status === 200) {
      console.log('上传成功');
    } else {
      console.error('上传出错');
    }
  };

  xhr.open('POST', '/upload', true);
  const formData = new FormData();
  formData.append('image', file);
  xhr.send(formData);
}

第三方库方案

使用现成库如Dropzone.js可快速实现拖拽上传等高级功能:

<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css">
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>

<form action="/upload" class="dropzone"></form>

配置参数示例:

js图片上传实现

Dropzone.options.myDropzone = {
  paramName: "file",
  maxFilesize: 5, // MB
  acceptedFiles: "image/*",
  addRemoveLinks: true
};

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

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现滚动

js实现滚动

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

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…