web页面按顺序上传文件,并显示上传进度条

1. 创建文件输入和上传按钮:

<div id="messages" class="clearfix" />
<input type="file" id="file-input" multiple>
<button id="upload-button">上传文件</button>

 

2. 编写 JavaScript 代码

$(document).ready(function() {
    var filesToUpload = []; // 用于存储文件队列
    var currentFileIndex = 0; // 当前上传文件的索引

    // 监听文件输入框的变化
    $('#file-input').on('change', function(e) {
        var files = e.target.files;
        for (var i = 0; i < files.length; i++) {
            filesToUpload.push(files[i]); // 将文件添加到队列
        }
        // 开始上传第一个文件
        uploadNextFile();
    });

    // 上传按钮事件
    $('#upload-button').on('click', function() {
        if (filesToUpload.length > 0) {
            uploadNextFile(); // 开始上传队列中的第一个文件
        }
    });

    // 上传文件的函数
    function uploadNextFile() {
        if (currentFileIndex < filesToUpload.length) {
            var file = filesToUpload[currentFileIndex];
            var formData = new FormData();
            formData.append('file', file); // 'file' 是后端接收文件的字段名
            
            //添加上传进度条
            showProgress(file.name, currentFileIndex)
            
            //找到当前进度条的元素
            var currentProgressSelector = `[lay-filter='progress${currentFileIndex}']`;
            var progressBar = document.querySelector(currentProgressSelector);
            
            //定时更新进度条, 模拟上传进度, 当前定义每秒进度+10
            var timer = setInterval(function() {
                var currentProgress = progressBar.firstChild.style.width
                //进度条已经在请求结果中改为100%时, 删除定时器
                if (currentProgress == '100%') {
                    clearInterval(timers[`timer_${currentFileIndex}`]);
                } else {
                    n = n + 10;
                    if (n > 95) {
                        n = 95;
                        clearInterval(timers[`timer_${currentFileIndex}`]);
                    }
                    element.progress('progress' + currentFileIndex, n + '%');
                }
            },1000)
            
            $.ajax({
                url: 'upload', // 后台处理文件的接口
                type: 'POST',
                data: formData,
                contentType: false,
                processData: false,
                success: function(response) {
                    //上传成功时,将进度条置为100%
                    element.progress("progress" + currentFileIndex, "100%");
                    element.render('progress');
                    console.log('文件上传成功:', response);
                    currentFileIndex++; // 移动到下一个文件
                    uploadNextFile(); // 继续上传下一个文件
                },
                error: function() {
                    console.log('文件上传失败');
                    currentFileIndex++; // 即使失败也移动到下一个文件
                    uploadNextFile(); // 继续上传下一个文件
                }
            });
        } else {
            console.log('所有文件已上传完毕');
            // 可以在这里执行上传完毕后的操作,比如通知用户
        }
    }
    
    //显示进度条
    function showProgress(fileName, i) {
        var msg = "<div class='progressbar'><div class='progressname'>" + fileName + "</div><div class='layui-progress layui-progress-big'  lay-filter='progress" + i + "'  lay-showpercent='true'><div class='layui-progress-bar' lay-percent='100%'></div></div></div>";
        $("#messages").append(msg);
    }
});

 

posted @ 2024-12-13 12:11  along_bro  阅读(44)  评论(0编辑  收藏  举报