js加php实现同时并发上传多个文件或文件夹

js+php实现同时并发上传多个文件或文件夹

js加php实现同时并发上传多个文件或文件夹

当我们上传大型文件或者很多文件(比如一个文件夹,包含很多子文件和子目录),如果采用传统的方式,一个接一个上传,可定很慢,那么有没有一种方式可以同时将所有的文件并行上传到服务器,最后汇总一下,有点像hadoop的map/reduce的模式,答案肯定是有的,js本身就是机遇event的异步单线程设计,异步的特性决定了不必等地io时间,直接去处理其他的事情。好了,那么首先解决怎么同时上传多个文件和文件夹的事情。

一、怎么选择文件夹和多个文件?

上传多个文件(multiple 属性ie9以上才支持)

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

上传整个文件夹目录(webkitdirectory属性只有chrome及chrome内核的浏览器和火狐支持)

  <input type='file'  name="file" webkitdirectory />//

那么接下来解决怎么同时上传的问题

二、怎么同时上传?

思路一、我们将多个文件放进Formdata构建form数据结合ajax来启动上传,代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>BFW NEW PAGE</title>
    <script id="bfwone" data="dep=jquery.17&err=0" type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/bfwone.js"></script>
    <script type="text/javascript">


        var files = [];

        bready(function() {
            $("#uploadfolder").change(function() {

                files = this.files;


            });

            $("#upload-btn").click(function() {

                var fd = new FormData();

                console.log(files);

                for (var i = 0; i < files.length; i++) {
                    
                    fd.append("file[]", files[i]);

                }


                $.ajax({
                    type: 'POST',
                    url: "/FolderUpload",
                    data: fd,
                    cache: false,
                    processData: false,
                    contentType: false,
                    dataType: 'json',

                    success: function (ret) {},
                    complete: function(XMLHttpRequest, textStatus) {}
                });

            });
        });
    </script>
    <style>
    </style>
</head>
<body>


    <input type='file' id="uploadfolder" name="file" multiple="multiple" />

    <button id="upload-btn">上传多个文件</button>


</body>
</html>

那么后端php怎么接受呢

<?php

function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
     ...

点击查看剩余70%

{{collectdata}}

网友评论1

  1. # 90
    不错
    lick 2022-07-22回复