如何通过拖放上传多个文件并使用ajax浏览

Posted

技术标签:

【中文标题】如何通过拖放上传多个文件并使用ajax浏览【英文标题】:how to upload multiple files with drag & drop and browse with ajax 【发布时间】:2019-05-25 19:12:04 【问题描述】:

如何通过拖放上传多个文件并使用 ajax 浏览? 下面的代码是我目前所拥有的并且效果很好,但只允许上传 1 个文件:

这是html

<div id="drop_file_zone" ondrop="upload_file(event)" ondragover="return false">
      <div id="drag_upload_file">
        <p>DROP FILE HERE</p>
        <p>or</p>
        <p><input class="browse" type="button" value="Browse" onclick="file_explorer();"></p>
        <input type="file" id="selectfile">
      </div>
</div>

以下是我使用的带有 ajax 的 javascript; :

 var fileobj;
  function upload_file(e) 
    e.preventDefault();
    fileobj = e.dataTransfer.files[0];
    ajax_file_upload(fileobj);
  

  function file_explorer() 
    document.getElementById('selectfile').click();
    document.getElementById('selectfile').onchange = function() 
        fileobj = document.getElementById('selectfile').files[0];
      ajax_file_upload(fileobj);
    ;
  

  function ajax_file_upload(file_obj) 
    if(file_obj != undefined) 
        var form_data = new FormData();                  
        form_data.append('file', file_obj);
      $.ajax(

        type: 'POST',
        url: 'ajax.php',
        contentType: false,
        processData: false,
        data: form_data,

        success:function(response) 
          //alert(response);
          $(".success").html(response);
          $('#selectfile').val('');
          $('.myFiles').load(document.URL +  ' .myFiles');

        

      );
    
  

还有上传的php:

$arr_file_types = ['image/png', 'image/gif', 'image/jpg', 'image/jpeg'];

if (!(in_array($_FILES['file']['type'], $arr_file_types))) 
echo "false";
return;

move_uploaded_file($_FILES['file']['tmp_name'], '../uploads/'. $_FILES['file']['name']);

echo "File uploaded successfully.<br /><br />";   

【问题讨论】:

【参考方案1】:

您似乎只获得了要上传的第一个文件“e.dataTransfer.files[0]”。尝试更改为:

  function upload_file(e) 
    e.preventDefault();
    //here you can get all files
    for (var i=0; i< e.dataTransfer.files.length;i++)
      fileobj = e.dataTransfer.files[i];
      ajax_file_upload(fileobj);
    
  

对于浏览,我猜同样的逻辑是有效的

function file_explorer() 
    document.getElementById('selectfile').click();
    document.getElementById('selectfile').onchange = function() 
      //here you can get all files
      for (var i=0; i< e.dataTransfer.files.length;i++)
          fileobj = document.getElementById('selectfile').files[i];
          ajax_file_upload(fileobj);
      
    ;
  

如果导航不起作用,您可以尝试使用 event.target https://developer.mozilla.org/en-US/docs/Web/API/Event/target 到达您的元素

【讨论】:

这适用于拖放!但浏览时不起作用。那么我该如何实现呢? 你可以使用相同的逻辑,我会更新我的答案。 不幸的是,我无法再使用此代码上传任何文件。顺便说一句,Darag & drop 效果很好

以上是关于如何通过拖放上传多个文件并使用ajax浏览的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 拖放 - 只允许从浏览器外部拖动

如何使用拖放技术编程上传图像

无法将文件从 React 上传到具有多个对象的 .net Core 5

Blazor 拖放上传文件转换格式并推送到浏览器下载

如何在Vue 2中处理文件上传

使用 HTML5/jQuery 上传拖放文件