实现jquery上传文件控件并显示进度条

流程图

pie
title 文件上传流程
"前端" : 50.0
"后端" : 50.0

ER图

erDiagram
    图片上传 ||--o 文件表 : 上传
    文件表 ||--o 图片 : 保存

步骤

步骤 描述
1 前端页面设计,包含文件选择按钮和进度条显示区域
2 通过jQuery选择文件按钮的change事件,获取选中的文件对象
3 使用FormData对象创建一个表单对象,并将选中的文件对象添加到表单中
4 使用jQuery的ajax方法发送表单数据到后端
5 后端接收到文件数据后,保存文件到指定的目录
6 后端返回上传进度给前端
7 前端根据后端返回的进度数据更新进度条显示区域

代码实现

HTML部分

<input type="file" id="fileInput" />
<div id="progressBar"></div>

JavaScript部分

// 选中文件后触发change事件
$('#fileInput').on('change', function() {
  // 获取选中的文件对象
  var file = $(this)[0].files[0];
  
  // 创建FormData对象
  var formData = new FormData();
  // 将文件对象添加到FormData对象中
  formData.append('file', file);

  // 发送文件数据到后端
  $.ajax({
    url: '/upload',
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    xhr: function() {
      // 创建XHR对象,并重写upload的progress事件
      var xhr = $.ajaxSettings.xhr();
      xhr.upload.onprogress = function(e) {
        if (e.lengthComputable) {
          // 计算上传进度
          var progress = Math.round((e.loaded / e.total) * 100);
          // 更新进度条显示
          $('#progressBar').css('width', progress + '%');
          $('#progressBar').text(progress + '%');
        }
      };
      return xhr;
    },
    success: function(response) {
      // 文件上传成功
    },
    error: function() {
      // 文件上传失败
    }
  });
});

后端代码

const express = require('express');
const app = express();
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), function(req, res) {
  // 文件上传完成后的处理逻辑
  res.send('Upload Success');
});

app.listen(3000, function() {
  console.log('Server started on port 3000');
});

代码说明

  1. HTML部分包含一个文件选择按钮和一个进度条显示区域。
  2. JavaScript部分使用jQuery选择文件按钮的change事件,获取选中的文件对象。
  3. 使用FormData对象创建一个表单对象,并将选中的文件对象添加到表单中。
  4. 使用jQuery的ajax方法发送表单数据到后端,其中processData和contentType设置为false,以便正确处理FormData对象。
  5. 在ajax的xhr配置中,重写upload的progress事件,计算上传进度并更新进度条显示。
  6. 后端使用multer中间件处理文件上传,将文件保存到指定的目录。
  7. 后端返回上传进度给前端,前端根据进度更新进度条显示。

以上代码实现了一个简单的jQuery文件上传控件,并显示上传进度条。你可以根据实际需求进行修改和扩展。