当前位置:首页 > JavaScript

js 实现异步上传

2026-03-01 04:25:44JavaScript

异步上传的实现方法

使用 JavaScript 实现异步上传可以通过多种方式完成,以下是几种常见的方法:

XMLHttpRequest (XHR)

XMLHttpRequest 是传统的异步上传方式,适用于大多数现代浏览器。

const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('file', fileInput.files[0]);

xhr.open('POST', '/upload', true);
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('上传成功');
  } else {
    console.error('上传失败');
  }
};
xhr.send(formData);

Fetch API

Fetch API 提供了更现代、更简洁的异步上传方式。

const formData = new FormData();
formData.append('file', fileInput.files[0]);

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

Axios

Axios 是一个流行的 HTTP 客户端库,支持异步上传。

const formData = new FormData();
formData.append('file', fileInput.files[0]);

axios.post('/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})
.then(response => console.log('上传成功'))
.catch(error => console.error('上传失败:', error));

进度监控

如果需要监控上传进度,可以使用 XHR 或 Axios 提供的进度事件。

XHR 进度监控

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

Axios 进度监控

axios.post('/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  onUploadProgress: function(progressEvent) {
    const percentComplete = (progressEvent.loaded / progressEvent.total) * 100;
    console.log(`上传进度: ${percentComplete}%`);
  }
});

文件分块上传

对于大文件,可以考虑分块上传以提高可靠性和性能。

const chunkSize = 1024 * 1024; // 1MB
const file = fileInput.files[0];
const totalChunks = Math.ceil(file.size / chunkSize);

for (let i = 0; i < totalChunks; i++) {
  const start = i * chunkSize;
  const end = Math.min(start + chunkSize, file.size);
  const chunk = file.slice(start, end);

  const chunkFormData = new FormData();
  chunkFormData.append('chunk', chunk);
  chunkFormData.append('chunkIndex', i);
  chunkFormData.append('totalChunks', totalChunks);
  chunkFormData.append('fileName', file.name);

  fetch('/upload-chunk', {
    method: 'POST',
    body: chunkFormData
  })
  .then(response => console.log(`分块 ${i} 上传成功`))
  .catch(error => console.error(`分块 ${i} 上传失败:`, error));
}

错误处理

无论使用哪种方法,都应该包含适当的错误处理逻辑。

fetch('/upload', {
  method: 'POST',
  body: formData
})
.then(response => {
  if (!response.ok) {
    throw new Error(`HTTP 错误: ${response.status}`);
  }
  return response.json();
})
.then(data => console.log('上传成功:', data))
.catch(error => console.error('上传过程中出错:', error));

跨域上传

如果需要跨域上传,确保服务器配置了 CORS 头部。

js 实现异步上传

fetch('https://other-domain.com/upload', {
  method: 'POST',
  body: formData,
  mode: 'cors',
  credentials: 'include' // 如果需要发送 cookies
})
.then(response => console.log('跨域上传成功'))
.catch(error => console.error('跨域上传失败:', error));

这些方法涵盖了 JavaScript 中实现异步上传的主要技术,可以根据具体需求选择最适合的方案。

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

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…