【问题标题】:File Upload Progress Event not firing, although file uploads文件上传进度事件未触发,尽管文件上传
【发布时间】:2020-11-10 20:57:59
【问题描述】:

我在这里看到过一些类似问题的帖子,但我似乎无法解决这个问题。基本上,我有一个似乎没有调用进度事件的 AJAX 文件上传器。其他事件触发得很好,文件上传完全符合我的预期,但没有调用进度事件。 Javascript如下所示:

$('input[name=avatar_upload]').change(function(e) {
    // Get the Form
    var setupForm = $('#setup-member-form');

    // Get the File Array
    var file = document.getElementById('avatar-upload').files[0];

    // Show the File Upload Progress
    $('#avatar-upload-progress').show();

    // Create a new Form Data Object
    var formData = new FormData();

    // Add the File
    formData.append('avatar', file);

    // Create the AJAX Object
    var ajax = new XMLHttpRequest();

    // Add the Event Listeners
    ajax.addEventListener("loadstart", function(evt) {
         // Do something in here...
         $('#output').append("upload starting...\n");
    }, false);
    ajax.addEventListener("progress", function(evt) {
         var percentLoaded = (evt.loaded / evt.total) * 100;
         $('#output').append(percentLoaded + "% loaded\n");
         $('#avatar-upload-progress .ui-progress-bar-inner').animate({'width' : percentLoaded + '%'}, 400);
    }, false);
    ajax.addEventListener("load", function(evt) {
         // Do something in here when loaded...
         $('#output').append("upload complete!");
    }, false);

    // Open the Form
    ajax.open("POST", $('input[name=upload_handler]').val());
    ajax.send(formData);
});

起初我以为可能只是因为文件太小,进度事件没有机会触发,但我用更大的文件尝试过,并且加载事件触发,然后有几秒钟暂停,然后触发完整事件。

如果有人有任何想法,请告诉我!

【问题讨论】:

    标签: javascript jquery ajax xmlhttprequest jquery-events


    【解决方案1】:

    刚刚对此进行了测试,对于上传,您必须使用 XMLHttpRequest.upload,因为将事件直接附加到 XMLHttpRequest 只会在上传时触发一次。

    documentation on MDN中也有说明

    $('#avatar-upload').on('change', function () {
        var file = document.getElementById('avatar-upload').files[0];
    
        $('#avatar-upload-progress').show();
        var formData = new FormData();
        formData.append('avatar', file);
    
        var ajax = new XMLHttpRequest();
    
        ajax.upload.addEventListener("loadstart", function (evt) {
            $('#output').append("upload starting...\n");
        }, false);
    
        ajax.upload.addEventListener("progress", function (evt) {
            var percentLoaded = (evt.loaded / evt.total) * 100;
            $('#output').append(percentLoaded + "% loaded\n");
            $('#avatar-upload-progress .ui-progress-bar-inner').animate({
                'width': percentLoaded + '%'
            }, 400);
        }, false);
    
        ajax.upload.addEventListener("load", function (evt) {
            $('#output').append("upload complete!");
        }, false);
    
        ajax.open("POST", $('input[name=upload_handler]').val());
        ajax.send(formData);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2012-03-01
      • 2012-05-17
      • 2013-09-04
      相关资源
      最近更新 更多