上传多个文件并显示进度栏 - javascript

我正在一个项目(在Django中)中创建一个页面,以添加有关文件的数据信息,然后添加文件本身。

上传多个文件并显示进度栏 - javascript

单击“更多数据集”按钮时,它将添加另一个字段以上传另一个文件。

上传多个文件并显示进度栏 - javascript

可以一口气附加最终用户想要的文件数。
我需要的是在单击“上传数据集”并显示单个进度条后,上传所有附件。
到目前为止,我已经完成了多个教程,但是使用Vitor Freitas's tutorial还是比较接近的。
JS代码:

$(function(){
/*$("#add_new_dataset").click(function(){
    $(".file").click();
});*/

$(".file").fileupload({
    dataType: 'json',
    sequentialUploads: true, /* Send the files one by one */
    start: function(e){ /* When the upload process starts, show the modal */
        $("#modal-progress").modal("show");
    },
    stop: function(e){  /* When the upload progress finalizes, hide the modal */
        $("#modal-progress").modal("hide");
    },
    progressall: function(e, data){ /* Update the progress bar */
        var progress = parseInt(data.loaded / data.total * 100, 10),
            strProgress = progress + "%";
            $(".progress-bar").css({"width": strProgress});
            $(".progress-bar").text(strProgress);
    },
    done: function(e, data){
        if(data.result.is_valid){
            $("#gallery tbody").prepend(
                "<tr><td><a href='" + data.result.url + "'>" + data.result.name + "</a></td></tr>"
            );
        }
    }
})
});

模板代码:

<form id="form" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="container-fluid" id="datasets" style="margin: 0px; padding: 0px;">
    <div class="row" onfocusin="populateFilename(this);">
        <label class="col-md-2">User Name :</label>
        <input class="col-md-2" type="text" id="username" name="user_name" value="{{ user.username }}" readonly />
        <label class="col-md-2">Data-set :</label>
        <input class="col-md-2" type="text" placeholder="Enter dataset" name="dataset" required />
        <label class="col-md-2">Creation Date :</label>
        <input class="col-md-2" type="date" placeholder="YYYY-MM-DD" name="creation_date" required />
        <label class="col-md-2">Beam Line:</label>
        <input class="col-md-2" type="text" placeholder="Enter beam line" name="beamline" required />
        <label class="col-md-2">Data-set file:</label>
        <input class="col-md-2 file" type="file" name="file" data-url="{% url 'add_data_sets' %}" data-form-data='{"csrfmiddlewaretoken": "{{ csrf_token }}"}' required />
        <label class="filename"></label>

        <div class="modal fade" id="modal-progress" data-backdrop="static" data-keyboard="false">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title">Uploading...</h4>
                    </div>
                    <div class="modal-body">
                        <div class="progress">
                            <div class="progress-bar" role="progressbar" style="width: 0%;">0%</div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div style="align: center; margin-top: 5px;">
    <div class="container btn-group btn-group-justified btn-group-lg">
        <a onmouseup="addRow();" class="btn btn-outline-secondary" style="width: 50%;">More Datasets</a>
        <button type="submit" class="btn btn-outline-primary" name="add_new_dataset" id="add_new_dataset">Submit Data-set</button>
    </div>
</div>

我该怎么办?我不太擅长AJAX,但是看不到任何可将数据发送到服务器端的代码。是这样还是我缺少什么?请忽略我对这个话题的无知,并感谢大家。

编辑:
JS代码已根据一些答案进行了重写。

document.getElementById('add_new_dataset').onclick = function() {
    $(this).preventDefault();

    console.log('Files uploading begin');
    form_data = new FormData();
    const files = document.getElementsByName('file');
    let count = 0;
    for(let i = 0; i < files.length; i++){
        count++;
        form_data.append("file", files[i]);
    }

    $.ajax({
        url: "/add_data_sets",
        dataType: 'json',
        contentType: false,
        processData: false,
        data: form_data,
        type: 'POST',
        success: function(files, response, xhr, pd){
            $('.file').show();
            if(files.status != false){
                $('.progress-bar').val('/location/' + files.filename);

                var fileData = files.filename;
                console.log('Files uploading...');
            }
            else{
                alert(files.filename);
            }
        },
        /*xhrFields: {
            onprogress: function(e) {
                if(e.lengthComputable) {
                    let percentCompleted = e.loaded / evt.total;
                    pBar.style.width = percentComplete;
                    pBar.innerHTML = percentComplete + "%";
                    console.log('Percent complete : ' + percentComplete);
                }
            }
        }*/
        xhr: function(){
            let xhr = $.ajaxSettings.xhr();
            xhr.upload.onprogress = function(e) {
                let percentCompleted = e.loaded / evt.total * 100;
                pBar.style.width = percentComplete;
                pBar.innerHTML = percentComplete + "%";
                console.log('Percent complete : ' + percentComplete);
            };
            return xhr;
        }

    });
//});
};

这只是上传代码块。从客户端到服务器端的数据发送工作正常,但是由于代码运行时未触发“ console.log”调用,因此令人怀疑。数据是否以某种方式正常提交,并且此代码没有执行任何操作。
编辑2:
新的JS函数:

function upload() {
        console.log('Upload function begins');
        let pBar = document.getElementsByClassName('progress-bar')[0],
            progressWindow = document.getElementById('modal-progress'),
            formData = new FormData(document.forms.form),
            xhr = new XMLHttpRequest(),
            percent = 0;

        console.log('Form Data created');
        // Start upload
        xhr.upload.onloadstart = function() {
            //$('#modal-progress').hide().fadeIn();
            //progressWindow
        };

        // Track upload progress
        xhr.upload.onprogress = function(event) {
            percent = parseInt(event.loaded / event.total * 100);
            pBar.innerHTML = percent + "%";
            pBar.style.width = percent + "%";
            //console.log(percent + '% completed');
            //console.log('Uploaded event.loaded of event.total');
        };

        // Report if ends with an error
        xhr.upload.onerror = function() {
            console.log('An error has occurred')
        };

        // Track completion: Both successful or not
        xhr.upload.onloadend = function() {
            //$('#modal-progress').fadeOut().hide();
            console.log('Upload complete with or without error ' + xhr.status);
        };

        // Track progress: Triggered on successful completion
        xhr.upload.onload = function() {
            console.log('Uploading complete');
            progressWindow.hidden = True;
        };

        xhr.open("POST", "{% url 'add_data_sets' %}", true);

        // The 'setRequestHeader' function can only be called when xhr is opened.
        //xhr.setRequestHeader('csrfmiddlewaretoken', '{{ csrf_token }}');
        //xhr.setRequestHeader('test-info', 'something');
        xhr.setRequestHeader('Content-Type', 'application/gzip');

        xhr.send(formData);
    }

该功能现在可以正常工作。它完全可以正常发送数据,但是在开发服务器控制台屏幕上却出现此错误。

Forbidden (CSRF token missing or incorrect.): /accounts/add_data_set/
[22/Feb/2020 15:36:06] "POST /accounts/add_data_set/ HTTP/1.1" 403 2513

我什至检查了记录的POST数据正发送到服务器,并且它确实包含csrf令牌

<QueryDict: {'csrfmiddlewaretoken': ['WREoIV0aY4B2XyrU7d9Qw8kMwiokXqwWsmbc2QSHX5VQ0EaYjjeuv7PeysMJjecp'], 'user_name': ['rakesh'], 'dataset': ['r'], 'creation_date': ['2020-02-22'], 'beamline': ['r']}>

我有点困惑。这是问题吗?

参考方案

如果您有任何fileuploader插件,那么他们的文档将包含所有内容,或者如果您希望普通文件上传输入,则可以通过将文件输入绑定到表单数据中来发布它们,然后执行操作以操作表单数据并保存图像,然后可以返回保存图片和显示,这样您就可以实现简单的ajax上传。

var form_data = new FormData();                  
        var totalFiles = document.getElementById('file').files.length;
        var count = 0;
        for (var i = 0; i < totalFiles; i++) {
            var file = document.getElementById('file').files[i];
            count++;
            form_data.append("file", file);
        }


$.ajax({
            url: "/uploadingaction",
            dataType: 'json',           
            contentType: false,
            processData: false,
            data: form_data,                             
            type: 'POST',
            success: function (files, response, xhr, pd) {
                $('yourloaderid').hide();                
                if (files.status != false) {                   
                    $('#displayid').val('/location/' + files.filename);

                    var filedata = files.filename;                                        

                } else {
                    alert(files.filename);
                }

            }
        })

如何使整个<div>可选? - javascript

我看过几篇有关使整个div可点击的文章,但我希望使其成为可选择的。我所拥有的是一个php while循环,该循环显示基于用户进入mySQL数据库的表。该代码如下所示: <div class='tracksub'> <div class='headname'><div class='…

当<form>'.submit'函数被覆盖时(使用Ajax)将数据获取到php吗? - javascript

我已覆盖此网页上表单的.submit函数,因为该网页已加载在“ index.php”中的#mainContent内,并且我希望“提交”按钮仅替换此#mainContent。我正在尝试将数据从此表单获取到.php文件,以便对数据库进行查询(或简单地回显已填充的变量,以指示已传递数据)。我是AJAX的新手。有人可以向我解释如何将数据传递到.php文件,或者指向要…

使用php重新加载内容 - javascript

在对网站进行编程时,我以前使用过此代码,它可以完美工作,但是现在当我想使用一些Flash部件时,每次单击链接时,它都会重新加载所有网站。源代码: <!DOCTYPE html> <html> <head> <title>Hot King Staff</title> <meta charset=…

用jQuery填充模式形式 - javascript

我正在将订单表从数据库绘制到datatables(jquery插件)中。我要在每笔最后一笔交易或每笔交易中增加付款。问题是,如何获取单击添加付款按钮以添加付款的行的订单ID。其次,当点击addpayment时,它会弹出一个带有字段或订单号的模态表单。我想用在td中找到的订单ID填充该字段,并使其不可编辑或隐藏,但在提交模态表单时将其发布到服务器。表格和模式表…

保留文本区域的数据或值,然后选择输入 - javascript

通过$ _POST提交表单时,输入文件值仍然保留。像这样: if($_POST){ $error = false; if(!$post['price']){ $error = true; $error_note['price'] = "*Should not be empty"; } if($err…