元素配合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处理逻辑:

js图片上传实现

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实现文件上传:

js图片上传实现

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>

配置参数示例:

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

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

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swip…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…