元素配合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>

配置参数示例:

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

js图片上传实现

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

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterv…

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promis…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…