当前位置:首页 > JavaScript

js 实现异步上传

2026-01-30 13:20:50JavaScript

异步上传的实现方法

使用XMLHttpRequest或Fetch API可以实现JavaScript的异步文件上传。以下是两种常见方法:

XMLHttpRequest方式

const uploadFile = (file) => {
  const formData = new FormData();
  formData.append('file', file);

  const xhr = new XMLHttpRequest();
  xhr.open('POST', '/upload', true);

  xhr.upload.onprogress = (e) => {
    if (e.lengthComputable) {
      const percentComplete = (e.loaded / e.total) * 100;
      console.log(`上传进度: ${percentComplete}%`);
    }
  };

  xhr.onload = () => {
    if (xhr.status === 200) {
      console.log('上传成功', xhr.responseText);
    } else {
      console.error('上传失败');
    }
  };

  xhr.send(formData);
};

Fetch API方式

const uploadFile = async (file) => {
  const formData = new FormData();
  formData.append('file', file);

  try {
    const response = await fetch('/upload', {
      method: 'POST',
      body: formData
    });

    if (response.ok) {
      const data = await response.json();
      console.log('上传成功', data);
    } else {
      throw new Error('上传失败');
    }
  } catch (error) {
    console.error('上传出错:', error);
  }
};

进度显示实现

通过监听上传进度事件可以实时显示上传进度:

xhr.upload.onprogress = (event) => {
  const progress = Math.round((event.loaded / event.total) * 100);
  document.getElementById('progress-bar').style.width = `${progress}%`;
  document.getElementById('progress-text').innerText = `${progress}%`;
};

多文件上传处理

对于多文件上传,可以修改FormData的构建方式:

const uploadMultipleFiles = (files) => {
  const formData = new FormData();

  Array.from(files).forEach((file, index) => {
    formData.append(`file_${index}`, file);
  });

  // 其余上传逻辑与单文件相同
};

错误处理机制

完善的错误处理应该包括:

xhr.onerror = () => {
  console.error('上传过程中发生网络错误');
};

xhr.onabort = () => {
  console.warn('用户取消了上传');
};

现代前端框架中的实现

在React中可以使用axios库:

js 实现异步上传

import axios from 'axios';

const upload = async (file) => {
  const formData = new FormData();
  formData.append('file', file);

  const config = {
    onUploadProgress: progressEvent => {
      const percent = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      console.log(percent);
    }
  };

  try {
    await axios.post('/upload', formData, config);
  } catch (err) {
    console.error(err);
  }
};

这些方法提供了从基础到进阶的异步上传实现方案,可根据具体需求选择适合的方式。

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

相关文章

vue.js实现轮播

vue.js实现轮播

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

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…