<input type=“file“>实现上传文件

本文介绍了如何使用HTML的`<form>`和`<input type='file'>`进行文件上传,并通过JavaScript实现文件数量及类型的验证。示例代码展示了如何限制上传文件为.jpg, .jpeg, .png格式,以及如何在用户未选择文件或文件格式不正确时给出警告。文章还解释了`enctype=multipart/form-data`在文件上传中的必要性。

嗨害嗨,我又来了奥。今天讲一个项目中常见的例子,就是利用input type="file"来进行表单上传文件。首先,我们写好html,如下。

    <form id="form1" action="/" method="post" enctype="multipart/form-data">
        <div>
            <label for="profile_pic">Choose file to upload</label>
            <input multiple="multiple" type="file" id="profile_pic" name="profile_pic" accept=".jpg,.jpeg,.png">
        </div>
        <div>
            <button type="button" id="btn">提交</button>
        </div>
    </form>

这外面是一个form表单,method方法为post,action属性规定当提交表单时,向何处发送表单数据。(这是必需的属性),我们这里直接用‘/’代替了。enctype是encode type的缩写,就是编码类型的意思。默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。

然后我们可以利用input type="file"来点击上传文件,multiple为多种多样的,在这里是代表可以上传多个文件(按住ctrl键就可以进行多选)。accept可以限制文件的上传类型,比如只上传图片文件、视频文件、音频文件等等。然后我们点击这个按钮,在没有写type="button"的时候,会发现不用写js直接就可以提交。为什么呢?原来button有一个type属性,而type有三个可选属性:button,submit,reset,而button按钮的type属性默认值是submit ,所以在没有指定type属性的情况下,点击button按钮触发提交form表单。解决:给button添加type属性,属性值设为button,问题就解决了。

现在写js进行表单验证,代码如下:

        const btn = document.getElementById("btn");
        const form1 = document.getElementById("form1");
        const pic = document.getElementById("profile_pic");
        btn.onclick = function () {
            //如果文件输入框的文件的长度为0,则弹出警告
            if (pic.files.length == 0) {
                alert("请先至少选择一个文件!");
                return;
            }
            //提交文件    HTMLFormElement.submit() 用来提交表单 <form>。
            //判断文件是否符合要求
            for (let i = 0; i < pic.files.length; i++) {
                console.log(i);  //0 1 2 3
                if (!checkFormat(pic.files[i])) {
                    alert("请确保上传的文件符合要求(.jpg/.png/.jpeg)")
                    return
                }
            }
            alert("上传成功!")
            form1.submit();
        }

        function checkFormat(o) {
            let filename = o.name;//文件名称
            let suffix = filename.substr(filename.lastIndexOf('.') + 1).toLowerCase();  //png jpg等
            let file_format = ['jpg', 'png', 'jpeg'];
            //看看这个后缀存不存在于file_format数组当中
            if (file_format.includes(suffix)) {
                return true
            }
            return false
        }

1、首先获取按钮,表单和input[type="file"]的dom对象,点击按钮的时候,判断:如果文件输入框的文件的长度为0,则弹出警告,然后return禁止提交。 

2、随后,有文件的情况下,点击提交会判断文件格式是否满足要求。这里封装了一个方法(checkFormat),参数是一个对象,如果对象的name中最后一个"."的后缀名为规定的数组里面的值的话,就返回true,否则返回false。这里用到了ES6新特性中的includes方法,判断这个后缀名是否在这个数组里面。如果有一个不在,则弹出警告:请确保上传的文件符合要求(.jpg/.png/.jpeg),再return禁止提交。

3、如果都满足的话,就提交成功。

如果有什么疑问,欢迎在评论区一起讨论,咱们下次见!

在 Fomantic UI 的文件上传组件 `<div class="ui file input"><input type="file"></div>` 中,定义参数可从 HTML 属性和 JavaScript 事件处理两方面进行。 #### HTML 属性定义参数 - **`accept` 属性**:用于限制可上传文件类型。例如,若只允许上传 Excel 文件和 CSV 文件,可设置为 `accept=".xls,.xlsx,.csv"`。示例代码如下: ```html <div class="ui file input"> <input type="file" accept=".xls,.xlsx,.csv"> </div> ``` - **`multiple` 属性**:若要支持同时上传多个文件,可添加 `multiple` 属性。示例如下: ```html <div class="ui file input"> <input type="file" multiple> </div> ``` - **`name` 属性**:在表单提交时,`name` 属性用于标识上传文件的参数名。例如: ```html <form action="/upload" method="post" enctype="multipart/form-data"> <div class="ui file input"> <input type="file" name="uploadFile"> </div> <input type="submit" value="上传"> </form> ``` #### JavaScript 事件处理定义参数 可通过监听 `change` 事件,在事件处理函数中获取文件信息并进行处理。示例如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Fomantic UI 文件上传</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.0/dist/semantic.min.css"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.0/dist/semantic.min.js"></script> </head> <body> <div class="ui file input"> <input type="file" id="fileInput"> </div> <script> const fileInput = document.getElementById('fileInput'); fileInput.addEventListener('change', function(event) { const files = event.target.files; for (let i = 0; i < files.length; i++) { console.log('文件名:', files[i].name); console.log('文件大小:', files[i].size); } }); </script> </body> </html> ```
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值