元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…">
当前位置:首页 > JavaScript

js实现图片上传

2026-01-12 13:12:36JavaScript

图片上传的基本实现

使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于显示预览的图片元素。

<input type="file" id="upload" accept="image/*">
<img id="preview" src="#" alt="Preview">

监听文件选择变化

通过监听input元素的change事件获取用户选择的文件。使用FileReader对象读取文件内容并显示预览。

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

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

上传图片到服务器

使用FormData对象构造表单数据,通过fetchXMLHttpRequest发送到服务器。这里展示使用fetch的现代方法。

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

  fetch('/upload', {
    method: 'POST',
    body: formData
  })
  .then(response => response.json())
  .then(data => console.log('上传成功:', data))
  .catch(error => console.error('上传失败:', error));
}

// 在change事件处理中调用
document.getElementById('upload').addEventListener('change', function(e) {
  const file = e.target.files[0];
  uploadImage(file);
});

图片压缩处理

对于大图上传,可以使用Canvas API进行压缩。创建一个临时Canvas元素,调整尺寸和质量后转换为Blob对象上传。

function compressImage(file, maxWidth = 800, quality = 0.7) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = function(e) {
      const img = new Image();
      img.onload = function() {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');

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

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

        canvas.toBlob(resolve, 'image/jpeg', quality);
      };
      img.src = e.target.result;
    };
    reader.readAsDataURL(file);
  });
}

// 使用压缩后的图片上传
compressImage(file).then(blob => {
  uploadImage(blob);
});

多图上传实现

通过添加multiple属性允许选择多个文件,遍历文件列表逐个处理。

<input type="file" id="upload" accept="image/*" multiple>
<div id="previews"></div>
document.getElementById('upload').addEventListener('change', function(e) {
  const files = e.target.files;
  Array.from(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.maxWidth = '200px';
      document.getElementById('previews').appendChild(img);
    };
    reader.readAsDataURL(file);
  });
});

进度显示

使用XMLHttpRequestupload事件可以跟踪上传进度,创建进度条显示上传状态。

js实现图片上传

function uploadWithProgress(file) {
  const xhr = new XMLHttpRequest();
  const formData = new FormData();
  formData.append('image', file);

  xhr.upload.addEventListener('progress', function(e) {
    const percent = Math.round((e.loaded / e.total) * 100);
    console.log(`上传进度: ${percent}%`);
    // 更新UI进度条
  });

  xhr.open('POST', '/upload');
  xhr.send(formData);
}

注意事项

  • 服务器端需要配置相应的接口接收文件,常见框架如Express、Django等都提供文件处理中间件
  • 生产环境应考虑添加文件大小限制、类型校验等安全措施
  • 移动端可能需要额外处理相机拍摄的图片方向问题
  • 对于大量图片上传,建议实现分片上传或断点续传功能

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

相关文章

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现交换

js实现交换

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

php实现异步图片上传

php实现异步图片上传

异步图片上传的实现方法 在PHP中实现异步图片上传通常需要结合前端JavaScript和后端PHP代码。以下是几种常见的方法: 使用XMLHttpRequest或Fetch API 前端使用Java…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

php实现图片上传预览

php实现图片上传预览

图片上传预览的实现方法 在PHP中实现图片上传预览功能,通常需要结合前端JavaScript和后端PHP代码。以下是具体的实现步骤: 前端HTML和JavaScript部分 创建包含文件输入和预览…