from 默认的上传模式

多文件上传
https://segmentfault.com/a/1190000006716454

enctype=”application/x-www-form-urlencoded”>

  1. <form action="server/upload.php" method="post" enctype="application/x-www-form-urlencoded">
  2. <input type="text" name="filename"><br />
  3. <input type="file" name="file"><br />
  4. <input type="submit" value="上传" />
  5. </form>

多文件上传

同步方式

方法一:一个输入框

enctype=”multipart/form-data

input type = “file” name=”file[]” multiple 属性

    <form action="server/m_upload.php" method="post" enctype="multipart/form-data">
        <input type="text" name="filename"><br />
        <input type="file" name="file[]" multiple><br />
        <input type="submit" value="上传" />
    </form>

方法二:多个输入框

    <form action="server/upload.php" method="post" enctype="multipart/form-data">
        <input type="text" name="filename"><br />
        <input type="file" name="file[]"><br />
        <input type="file" name="file[]"><br />
        <input type="file" name="file[]"><br />
        <input type="file" name="file[]"><br />
        <input type="file" name="file[]"><br />
        <input type="submit" value="上传" />
    </form>

FormData.append()

FormData.set()

FormData.get()

FormData.getAll()

FormData.delete()

    var oUsername = document.getElementById('username'),
        oPassword = document.getElementById('password'),
        oSubmitBtn = document.getElementById('submitBtn'),
        fd = new FormData();
    oSubmitBtn.onclick = function () {
        fd.append('Username', '赵六');
        fd.append('Password', '888');
        fd.append('Username', '王五');
        fd.append('Password', '456');

        console.log(fd); // FormData{}

        console.log('username:' + fd.get('Username'));
        console.log('username:' + fd.getAll('Username'));
        console.log('password:' + fd.get('Password')); 


        fd.set('Username', '李四');
        console.log('username:' + fd.get('Username'));
        console.log('username:' + fd.getAll('Username'));


        console.log(fd.has('Password'));

        fd.delete('Password');

        console.log('password:' + fd.get('Password'));

image.png

实战

多文件上传精简版

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        ul {
            padding: 0;
            margin: 0;
            margin-top: 100px;
            list-style: none;
        }

        .progress-bar {
            position: relative;
            width: 300px;
            height: 40px;
            border: 1px solid #666;
        }

        .progress {
            width: 0;
            height: 100%;
            background-color: green;
        }

        .error-info {
            display: block;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            text-align: center;
            line-height: 40px;
            font-size: 14px;
        }
    </style>
</head>

<body>
    <input type="file" id="file" multiple />
    <input type="submit" id="submitBtn" value="上传" />

    <ul id="progress-wrap">
        <li class="progress-bar">
            <div class="progress"></div>
        </li>
    </ul>

</body>
<script>
    var oSubmitBtn = document.getElementById('submitBtn'),
        oFile = document.getElementById('file'),
        oProgressWrap = document.getElementById('progress-wrap');

    oFile.onchange = function () {
        console.log(oFile.files);
        var files = oFile.files,
            fileLen = files.length; //获取上传文件的数量

            var fd = new FormData();

        for (var i = 0; i < fileLen; i++) {

            fd.set('file', files[i]);

            var o = window.XMLHttpRequest ?
                new window.XMLHttpRequest() :
                new ActiveXObject('Microsoft.XMLHTTP');

            if (!o) {
                throw new Error('您的浏览器不支持AJAX异步发起HTTP请求');
            }
            o.open('post', 'server/upload.php');
            // console.log(fd);
            console.log(fd.getAll("file"));
            o.send(fd);

        }
        console.log(fd.getAll("file"));
    }
</script>

</html>

多文件上传详细版

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        ul {
            padding: 0;
            margin: 0;
            margin-top: 100px;
            list-style: none;
        }

        .progress-bar {
            position: relative;
            width: 300px;
            height: 40px;
            border: 1px solid #666;
        }

        .progress {
            width: 0;
            height: 100%;
            background-color: green;
        }

        .error-info {
            display: block;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            text-align: center;
            line-height: 40px;
            font-size: 14px;
        }
    </style>
</head>

<body>
    <input type="file" id="file" multiple />
    <input type="submit" id="submitBtn" value="上传" />

    <ul id="progress-wrap">
        <li class="progress-bar">
            <div class="progress"></div>
        </li>
    </ul>

</body>
<script>
    var oSubmitBtn = document.getElementById('submitBtn'),
        oFile = document.getElementById('file'),
        oProgressWrap = document.getElementById('progress-wrap');

    oFile.onchange = function () {
        console.log(oFile.files);
        var files = oFile.files,
            fileLen = files.length; //获取上传文件的数量

        if (fileLen > 5) {
            console.log(new Error('最多可同时上传5张图片'));
            return;
        }

        oProgressWrap.innerHTML = '' //有新的上传则清空现有的进度条

        var fileName = '',
            maxSize = 3221225472,
            fd = null,
            errorInfo = '';

        for (var i = 0; i < fileLen; i++) {
            fileName = files[i].name.toLowerCase(),
                fileSize = files[i].size;

            if (!/\.(gif|jpg|jpeg|png)$/.test(fileName)) {
                errorInfo = '『' + fileName + '』文件不是图片类型';
            }

            // if (!/\.(mp4)$/.test(fileName)) {
            //     errorInfo =  '『' + fileName + '』文件不是mp4类型';
            // }

            if (fileSize > maxSize) {
                errorInfo = '『' + fileName + '』超过最大大小';
            }

            var oProgressBar = document.createElement('li'); //创建li
            oProgressBar.className = 'progress-bar';

            oProgressWrap.appendChild(oProgressBar); //将创建的li元素添加道ul oProgressWrap 上

            // 如果有错误提示则显示错误提示 
            if (errorInfo !== '') {
                oProgressBar.innerHTML = '<span class="error-info>' + errorInfo + '</span>'
            } else {
                oProgressBar.innerHTML = '<div class="progress"></div>'

                fd = new FormData();
                fd.append('file', files[i]);

                var o = window.XMLHttpRequest ?
                    new window.XMLHttpRequest() :
                    new ActiveXObject('Microsoft.XMLHTTP');

                if (!o) {
                    throw new Error('您的浏览器不支持AJAX异步发起HTTP请求');
                }
                o.open('post', 'server/upload.php');
                (function (i) {
                    // 数据传输中
                    o.upload.onprogress = function (e) {
                        var e = e || window.event,
                            percent = e.loaded / e.total * 100 + '%',
                            thisProgressBar = oProgressWrap.getElementsByClassName('progress-bar')[i];
                        thisProgressBar.getElementsByClassName('progress')[0].style.width = percent;
                    }
                })(i);
                console.log(fd);
                o.send(fd);
            }

        }


    }

</script>

</html>