JavaScript 前端取消上传

在前端开发中,经常会遇到上传文件的需求。然而,有时候用户可能会不小心选择了错误的文件,或者在上传过程中改变了主意,这时候就需要提供一个取消上传的功能。本文将介绍如何使用 JavaScript 实现前端取消上传的功能,并提供代码示例。

取消上传的原理

在介绍具体的实现方式之前,我们先来了解一下取消上传的原理。当用户点击取消上传按钮时,我们需要做两件事情:

  1. 终止当前正在进行的上传任务。
  2. 清除已经上传的文件片段,以节省服务器资源。

在前端开发中,上传文件通常使用 XMLHttpRequest 对象进行处理。我们可以利用 XMLHttpRequest 对象的 abort() 方法来终止上传任务。同时,我们还需要通过 FormData 对象来获取上传的文件片段,并将其清除。

使用 XMLHttpRequest 取消上传

以下是一个使用 XMLHttpRequest 对象实现取消上传的示例代码:

// 创建一个全局的 XMLHttpRequest 对象
var xhr;

// 上传文件的函数
function uploadFile(file) {
  xhr = new XMLHttpRequest();
  
  // 绑定 onreadystatechange 事件
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      // 上传完成后的处理逻辑
    }
  }
  
  // 绑定 onabort 事件
  xhr.onabort = function() {
    // 取消上传后的处理逻辑
  }
  
  // 绑定上传进度事件
  xhr.upload.onprogress = function(event) {
    if (event.lengthComputable) {
      var percent = (event.loaded / event.total) * 100;
      console.log('上传进度: ' + percent + '%');
    }
  }
  
  // 执行上传任务
  xhr.open('POST', '/upload', true);
  xhr.send(file);
}

// 取消上传的函数
function cancelUpload() {
  if (xhr) {
    xhr.abort();
  }
}

在上述代码中,我们首先创建了一个全局的 XMLHttpRequest 对象 xhr,用于终止上传任务。接下来,我们定义了一个 uploadFile() 函数,用于实际执行上传任务。在 uploadFile() 函数中,我们通过 xhr.onreadystatechange 对象来监听上传状态,并在上传完成后执行相应的处理逻辑。我们还通过 xhr.onabort 对象来监听取消上传事件,并在取消上传后执行相应的处理逻辑。通过 xhr.upload.onprogress 对象,我们可以得到上传的进度信息。最后,我们定义了一个 cancelUpload() 函数,用于取消上传任务。

使用 FormData 清除文件片段

为了确保取消上传后不占用服务器资源,我们还需要清除已经上传的文件片段。以下是一个使用 FormData 对象清除文件片段的示例代码:

// 创建一个全局的 FormData 对象
var formData;

// 上传文件的函数
function uploadFile(file) {
  formData = new FormData();
  formData.append('file', file);
  
  // 执行上传任务
  // ...
}

// 取消上传的函数
function cancelUpload() {
  if (formData) {
    formData.delete('file');
  }
}

在上述代码中,我们首先创建一个全局的 FormData 对象 formData,用于存储上传的文件片段。在上传文件时,我们通过 formData.append() 方法将文件片段添加到 formData 对象中。在取消上传时,我们通过 formData.delete() 方法将文件片段从 formData 对象中删除。

示例应用

为了更好地理解如何使用上述代码实现取消上传的功能,我们可以创建一个示例应用。以下是一个使用 Vue.js 框架实现的上传文件组件示例代码:

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="upload">上传</button>
    <button @click="cancelUpload">取消</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      file: null,
      xhr: null
    };
  },
  methods: {
    handleFileChange(event) {
      this.file = event.target.files[0];
    },
    upload() {
      this.xhr = new XMLHttpRequest();
      
      this.xhr.onreadystatechange = function() {
        if (this.xhr.readyState === 4) {
          // 上传完成后的处理逻辑