当前位置: 首页 > 知识库问答 >
问题:

HTML5多文件上传:通过AJAX逐个上传

谭富
2023-03-14

我有一个多文件上传表单:

<input type="file" name="files" multiple />

我用ajax发布这些文件。我想一个接一个地上传选定的文件(为了创建单独的进度条,出于好奇)。

我可以通过以下方式获得文件列表或单个文件:

FL = form.find('[type="file"]')[0].files
F  = form.find('[type="file"]')[0].files[0]

耶林

FileList { 0=File, 1=File, length=2 }
File { size=177676, type="image/jpeg", name="img.jpg", more...}

但是FileList是不可变的,我不知道如何提交单个文件。

我认为这是可能的,正如我所看到的http://blueimp.github.com/jQuery-File-Upload/.我不想使用这个插件,因为它与学习和结果一样重要(而且无论如何它需要太多的攻击)。我也不想使用Flash。

共有3个答案

锺离森
2023-03-14

我遇到了同样的问题,并带来了这个解决方案。我只需使用多部分检索表单,并在递归调用(文件后的文件)中启动ajax请求,该请求仅在完成后调用下一个。

var form = document.getElementById( "uploadForm" );
var fileSelect = document.getElementById( "photos" );
var uploadDiv = document.getElementById( "uploads" );

form.onsubmit = function( event ) {
    event.preventDefault(  );

    var files = fileSelect.files;
    handleFile( files, 0 );
};

function handleFile( files, index ) {
    if( files.length > index ) {
        var formData = new FormData(  );
        var request = new XMLHttpRequest(  );

        formData.append( 'photo', files[ index ] );
        formData.append( 'serial', index );
        formData.append( 'upload_submit', true );

        request.open( 'POST', 'scripts/upload_script.php', true );
        request.onload = function(  ) {
            if ( request.status === 200 ) {
                console.log( "Uploaded" );
                uploadDiv.innerHTML += files[ index ].name + "<br>";
                handleFile( files, ++index );
            } else {
                console.log( "Error" );
            }
        };
        request.send( formData );
    }
}
朱鹤轩
2023-03-14

这看起来是一个非常好的教程,正是您想要的。

注意到,并非所有浏览器都支持通过vanilla ajax上传,我仍然建议使用iframe。(即动态创建iframe并使用javascript发布)

我一直在使用这个脚本,我发现它非常简洁。如果你想学习如何通过创建iframe来上传,你应该深入了解它的源html" target="_blank">代码。

希望有帮助:)

额外编辑

要使用iframe方法创建进度条,您需要在服务器端做一些工作。如果您使用的是php,您可以使用:

  • php5.4 的会话上传进度
  • 上传 php 的进度包

如果使用nginx你也可以选择用它们来编译上传进度模块

所有这些都以相同的方式工作——每次上传都有一个UID,您将通过ajax以一致的时间间隔请求与该ID相关的“进度”。这将返回由服务器确定的上传进度。

裘禄
2023-03-14

要使其成为同步操作,需要在完成最后一次传输时启动新传输。例如,Gmail可以同时发送所有信息。AJAX文件上传进度的事件是原始XmlHttpRequest实例上的progress

因此,在每个< code>$之后。ajax(),在服务器端(我不知道您将使用什么),发送一个JSON响应,在下一次输入时执行ajax。一种选择是将AJAX元素绑定到每个元素,以使事情变得更容易,所以您只需在< code>success中执行< code>$(this)即可。同级('输入')。execute_ajax()。

像这样的东西:

$('input[type="file"]').on('ajax', function(){
  var $this = $(this);
  $.ajax({
    'type':'POST',
    'data': (new FormData()).append('file', this.files[0]),
    'contentType': false,
    'processData': false,
    'xhr': function() {  
       var xhr = $.ajaxSettings.xhr();
       if(xhr.upload){ 
         xhr.upload.addEventListener('progress', progressbar, false);
       }
       return xhr;
     },
    'success': function(){
       $this.siblings('input[type="file"]:eq(0)').trigger('ajax');
       $this.remove(); // remove the field so the next call won't resend the same field
    }
  });
}).trigger('ajax');  // Execute only the first input[multiple] AJAX, we aren't using $.each

上面的代码将用于多个

var count = 0;

$('input[type="file"]').on('ajax', function(){
  var $this = $(this);
  if (typeof this.files[count] === 'undefined') { return false; }

  $.ajax({
    'type':'POST',
    'data': (new FormData()).append('file', this.files[count]),
    'contentType': false,
    'processData': false,
    'xhr': function() {  
       var xhr = $.ajaxSettings.xhr();
       if(xhr.upload){ 
         xhr.upload.addEventListener('progress', progressbar, false);
       }
       return xhr;
     },
    'success': function(){
       count++;
       $this.trigger('ajax');
    }
  });
}).trigger('ajax'); // Execute only the first input[multiple] AJAX, we aren't using $.each 

 类似资料:
  • 问题内容: 我有多个文件上传表单: 我正在用ajax发布这些文件。我想一个接一个地上传所选文件(以创建单独的进度条,并且出于好奇)。 我可以通过以下方式获取文件列表或单个文件 耶陵 但是FileList是不可变的,我不知道如何提交单个文件。 我认为这是可能的,因为我看到了http://blueimp.github.com/jQuery-File- Upload/ 。我不想使用这个插件,因为它既要学

  • 问题内容: 我遇到了这个简单的js ajax上传代码(由于某种原因,jquery 似乎不适用于HTML5), 但是我这里有两个问题, 这条线在物体之后是什么意思? 为什么在那里需要ID?我能做些什么使用jQuery 用? 此ajax仅用于单个文件上传,如何更改多个文件上传? 问题答案: 这行在对象FormData之后是什么意思? 在得到由它的ID元件。该抓住从元件中的第一选择的文件。将其追加到与字

  • 问题内容: 我使用2个文件index.js,upload.php尝试通过ajax上传文件(img),如果成功追加到div 。 但是它不起作用,有几个问题,下面我的代码有什么建议吗? 谢谢。 upload.php 1. 还需要添加吗? 2. 并检查$ _FILES的大小或tmp_name是否仍使用? index.js 3.这几行是对的吗? 4.我错过或错了什么吗? 问题答案: 在其构造函数中接受一个

  • 问题内容: 我想使用Ajax通过模式上传文件。我怎样才能做到这一点? 我的模态: 这是我的JavaScript文件: 这是我的控制器: 但它返回错误500。我认为Ajax不接受使用Bootstrap模式的文件上传。 问题答案: 您可以像这样通过ajax使用引导程序模式上载文件。 在表单标签中,使用属性enctype和html如下所示: js代码: 在您的控制器端,您可以执行以下功能来上传图像。

  • 问题内容: 选择图像,doc或pdf后,我想将它们通过okhttp3。如何进行此操作? 并在okhttp 3中 显示的错误是 谢谢。 问题答案: 所以我自己回答这个问题。 因此,我首先将输出流打开到一个临时文件。 扩展名取决于mime类型。您可以通过以下方式找到mime类型 现在从文件读取并将其内容写入临时文件 现在写入文件 最后 成功之后的最后

  • 我目前通过AJAX发布我的表单,代码如下: 现在,我想添加以相同形式上传图片的功能,并在这个JQUERY和相同的服务器端脚本中实现它。我唯一的问题是,我不知道怎么做…我测试了上面的代码,发现它没有将$_files-变量传递给服务器端脚本。 谁能带领我在任何方向,我需要做的,以增加与此脚本图像上传的可能性?