滨州网站建设公司/常州百度seo排名
🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
文章目录
- 一、引言
- 二、基本语法与属性设置
- (一)基本语法
- (二)重要属性
- 三、文件选择对话框与用户交互
- (一)文件选择对话框的触发
- (二)文件选择后的显示与信息获取
- 四、与服务器的交互
- (一)表单提交
- (二)服务器端处理
- 五、安全性考量
- (一)文件类型验证
- (二)文件大小限制
- (三)防止恶意文件上传
- 六、在不同场景下的应用优化
- (一)大文件上传优化
- (二)多文件批量上传优化
- 七、总结
一、引言
在现代网页应用中,文件上传功能是一项极为常见且重要的交互特性。无论是用户上传个人资料图片、分享文档,还是企业应用中的批量数据导入,都离不开文件上传功能的支持。而 HTML 中的<input>
元素搭配特定的属性设置,为实现文件上传提供了基础且强大的工具。本文将深入剖析 HTML <input>
文件上传功能的各个方面,包括其基本原理、属性设置、与服务器的交互、安全性考量以及在不同场景下的应用优化。
二、基本语法与属性设置
(一)基本语法
实现文件上传功能的<input>
元素基本语法如下:
<input type="file" name="fileUpload">
其中,type="file"
明确指定了该<input>
元素用于文件上传操作。name
属性则在表单提交时作为键,与上传文件的相关信息(如文件名、文件内容等)作为值一起发送给服务器。
(二)重要属性
- accept 属性
- 作用:用于限制可接受的文件类型。通过指定特定的 MIME 类型或文件扩展名,可以确保用户只能选择符合要求的文件进行上传。
- 示例:
accept="image/*"
表示只接受各种图像类型的文件;accept="application/pdf"
则仅允许上传 PDF 文件;还可以设置多个可接受的类型,如accept="image/png,image/jpeg,application/pdf"
。
- multiple 属性
- 作用:当设置了
multiple
属性时,用户可以在文件选择对话框中选择多个文件进行上传。这在需要批量上传文件的场景中非常有用,如批量上传图片库或多个文档。 - 示例:
<input type="file" name="filesUpload" multiple>
,用户在选择文件时,可以通过按住键盘上的特定键(如 Ctrl 键在 Windows 系统或 Command 键在 Mac 系统)来选择多个文件。
- 作用:当设置了
三、文件选择对话框与用户交互
(一)文件选择对话框的触发
当用户点击type="file"
的<input>
元素时,浏览器会弹出文件选择对话框。这个对话框的外观和操作方式在不同的浏览器和操作系统下可能会略有差异,但基本功能都是让用户浏览本地文件系统并选择要上传的文件。
(二)文件选择后的显示与信息获取
- 在用户选择文件后,通常在
<input>
元素旁边会显示所选文件的文件名(部分浏览器可能还会显示文件大小等简要信息)。在一些现代浏览器中,还可以通过 JavaScript 来获取更详细的文件信息,如文件类型、文件大小、最后修改日期等。例如:
const fileInput = document.getElementById('fileUpload');
fileInput.addEventListener('change', function() {const selectedFiles = this.files;for (let i = 0; i < selectedFiles.length; i++) {const file = selectedFiles[i];console.log('文件名:', file.name);console.log('文件大小:', file.size);console.log('文件类型:', file.type);}
});
- 如果设置了
accept
属性,文件选择对话框中会自动过滤掉不符合要求的文件,只显示可接受的文件类型,方便用户快速定位到合适的文件进行选择。
四、与服务器的交互
(一)表单提交
当文件上传<input>
元素位于一个<form>
表单内时,点击表单的提交按钮(通常是<button type="submit">
),表单会将文件上传相关的数据发送到服务器。在表单的method
属性设置为POST
(一般用于文件上传的常用方法)的情况下,文件数据会以特定的格式(如多部分表单数据格式,multipart/form-data
)被包含在 HTTP 请求中发送给服务器。
例如:
<form action="/upload" method="POST" enctype="multipart/form-data"><input type="file" name="fileUpload"><button type="submit">上传文件</button>
</form>
在这个例子中,当用户点击提交按钮后,浏览器会将所选文件以multipart/form-data
格式发送到/upload
这个服务器端的 URL 地址。
(二)服务器端处理
- 服务器端接收到文件上传请求后,需要使用相应的服务器端编程语言和框架来处理上传的文件。例如,在 Node.js 中,可以使用
express
框架结合multer
中间件来处理文件上传:
const express = require('express');
const multer = require('multer');
const app = express();const storage = multer.diskStorage({destination: function(req, file, cb) {// 设置文件存储的目录cb(null, 'uploads/');},filename: function(req, file, cb) {// 设置上传文件的文件名cb(null, file.fieldname + '-' + Date.now() + '.' + file.originalname.split('.').pop());}
});const upload = multer({ storage: storage });app.post('/upload', upload.single('fileUpload'), function(req, res) {// 文件上传成功后的处理逻辑res.send('文件上传成功');
});app.listen(3000, function() {console.log('服务器运行在 3000 端口');
});
在上述代码中,multer
中间件负责解析上传的文件数据,将文件存储到指定的目录,并在文件上传成功后执行相应的回调函数。
2. 对于其他服务器端语言,如 Python 的Flask
框架,可以使用flask_uploads
扩展来处理文件上传;在 PHP 中,可以通过$_FILES
超全局变量来获取上传文件的信息并进行处理。
五、安全性考量
(一)文件类型验证
虽然可以通过accept
属性在前端对文件类型进行初步限制,但这种限制是可以被绕过的。因此,在服务器端必须再次对上传文件的类型进行严格验证。可以通过检查文件的 MIME 类型、文件头信息或文件扩展名等多种方式来确保上传文件的类型符合预期。例如,在 Node.js 中,可以使用file-type
库来检查文件的类型:
const fileType = require('file-type');// 假设已经获取到上传文件的 buffer 数据
const buffer = //... 获取文件 buffer 数据的过程
const type = fileType(buffer);
if (type && (type.mime === 'image/png' || type.mime === 'image/jpeg')) {// 文件类型符合要求,继续处理
} else {// 文件类型不符合,拒绝上传
}
(二)文件大小限制
为了防止用户上传过大的文件导致服务器资源耗尽或应用程序出现异常,需要在前端和服务器端都设置文件大小限制。在前端,可以使用 JavaScript 来检查用户选择文件的大小,在超过一定限制时给予用户提示并阻止表单提交。例如:
const fileInput = document.getElementById('fileUpload');
fileInput.addEventListener('change', function() {const selectedFiles = this.files;const maxSize = 10 * 1024 * 1024; // 10MB 的限制for (let i = 0; i < selectedFiles.length; i++) {const file = selectedFiles[i];if (file.size > maxSize) {alert('文件过大,请选择小于 10MB 的文件');fileInput.value = ''; // 清空文件选择return;}}
});
在服务器端,也需要设置相应的文件大小限制配置。例如,在 Node.js 的multer
中间件中,可以设置limits
选项来限制文件大小:
const upload = multer({storage: storage,limits: {fileSize: 10 * 1024 * 1024 // 10MB 的限制}
});
(三)防止恶意文件上传
上传的文件可能包含恶意代码,如病毒、木马或恶意脚本。为了防止恶意文件上传,除了上述的文件类型和大小验证外,还可以对上传文件进行病毒扫描。一些服务器端安全软件或云服务提供了文件病毒扫描功能,可以集成到文件上传处理流程中。此外,对于可执行文件类型(如.exe
、.sh
等),一般应禁止上传,除非有特殊的、严格安全控制的应用场景。
六、在不同场景下的应用优化
(一)大文件上传优化
当上传大文件(如几 GB 的视频文件或大型数据库备份文件)时,传统的文件上传方式可能会出现问题,如上传过程中网络中断导致上传失败且需重新开始、长时间占用服务器资源等。为了优化大文件上传,可以采用以下技术:
- 分块上传:将大文件分割成多个小块,分别上传每个小块,在服务器端再将这些小块合并成完整的文件。这样即使在上传过程中出现网络中断,也可以只重新上传中断的小块,而不是整个文件。例如,可以使用
resumable.js
库在前端实现分块上传功能,在服务器端使用相应的逻辑来处理分块文件的接收和合并。 - 断点续传:结合分块上传,记录已上传的块信息,当上传中断后重新开始上传时,可以从上次中断的位置继续上传。这需要在前端和服务器端都建立相应的状态记录和恢复机制。
(二)多文件批量上传优化
在多文件批量上传场景中,除了前面提到的使用multiple
属性方便用户选择多个文件外,还可以在上传过程中提供进度条显示,让用户了解每个文件以及整个批量上传的进度。在服务器端,可以优化文件处理逻辑,采用异步处理或多线程处理等方式,提高批量上传的效率,减少用户等待时间。例如,在 Node.js 中,可以使用async
库来处理多个文件上传的异步操作,确保每个文件的上传和处理都不会阻塞其他文件的上传流程。
七、总结
HTML <input>
文件上传功能是构建现代网页应用中文件交互功能的重要基石。通过深入理解其基本语法、属性设置、与服务器的交互机制、安全性考量以及在不同场景下的应用优化方法,开发人员可以构建出安全、高效、用户体验良好的文件上传功能模块。在未来的网页开发中,随着网络技术的不断发展和用户需求的日益复杂,文件上传功能也将不断演进和完善,为用户提供更加便捷、强大的文件交互体验。
相关文章:

HTML Input 文件上传功能全解析:从基础到优化
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

小程序 —— Day1
组件 — view和scroll-view view 类似于HTML中的div,是一个块级元素 案例:通过view组件实现页面的基础布局 scroll-view 可滚动的视图区域,用来实现滚动列表效果 案例:实现纵向滚动效果 scroll-x属性:允许横向滚动…...

4.5 TCP 报文段的首部格式
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 TCP 报文段的基本结构2 固定部分2.1 源端口与目的端口2.2 序号2.3 确认号2.4 数据偏移2.5 保留字段2.6 控制位2.7 窗口2.8 检验和2.9 紧急指针 3 可变部分3.1 选项3.2 填…...

SQL 获取今天的当月开始结束范围:
使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL: FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …...

Qt复习学习
https://www.bilibili.com/video/BV1Jp4y167R9/?spm_id_from333.999.0.0&vd_sourceb3723521e243814388688d813c9d475f https://subingwen.cn/qt/qt-primer/#1-4-Qt%E6%A1%88%E4%BE%8B https://subingwen.cn/qt/ https://download.qt.io/archive/qt/1.1Qt的特点 1.2QT中的…...

Leetcode经典题5--轮转数组
题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出示例 : 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…...

C++的一些经典算法
以下是C的一些经典算法: 一、排序算法 冒泡排序(Bubble Sort) 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换…...

Windows环境中Python脚本开机自启动及其监控自启动
1 开机自启动 Windows 10/Windows Server 201X具有一个名为“启动”的已知文件夹,系统每次启动开始自动运行应用程序、快捷方式和脚本时都会检查该文件夹,而无需额外配置。 要在Windows启动时运行脚本,先使用WindowsR快捷键打开“运行”对话…...

XML 语言随笔
XML的含义 XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。XML与HTML(HyperText Markup Language,超文本标记语言)类似,但XML的设计目的是描述数据&…...

E卷-分割数组的最大差值
分割数组的最大差值 问题描述 给定一个由若干整数组成的数组 n u m s nums nums,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组)。分别对子数组求和得到两个值,然后计算这两个值的差值。请输出所有分割方案中,差值的最大值。 输入格…...

基于SpringBoot校园台球厅人员与设备管理系统设计与实现
1.1课题背景与意义 在Internet高速发展的今天,计算机的应用几乎完全覆盖我们生活的各个领域,互联网在经济,生活等方面有着举足轻重的地位,成为人们资源共享,信息快速传递的重要渠道。在中国,网上管理的兴起…...

异步FIFO的实现
异步FIFO是verilog中常见的设计,通常用于不同时钟域下的数据同步。 在实现 FIFO 时,无论是同步 FIFO 还是异步 FIFO ,通常会通过双口 RAM ( Dual Port RAM )并添加一些必要的逻辑来实现。双口 RAM的设计如下࿱…...

关于找工作的一些感悟
2024年找工作可以说难度十分艰巨,尤其是年底,除了外包公司还在不停的招聘以外,自研的公司基本很少在招聘了。今年有一个很大的感受就是投递了简历可能都没有几个人回复,即使有人回复百分之八十都是拒绝的,拒绝的理由一…...

docker 相关问题记录
docker mysql 一直重启解决办法(断电或者重启) 一直重启。。因为是内部开发,也没有备份最新的。所以不能删了重来。 方法: docker logs mysql5.7 看到错误跟innodb有关。 具体原因可以参考 http://acuilab.com/articles/2019/1…...

Devops 实践
Devops 实践 基本概念jenkins实践安装jenkins仓库环境准备代码环境准备第一次构建持续集成持续部署集成插件 优秀实践心得体会 参考 摘要:本文首先将介绍一些基本概念,包括Devops,CI/CD等,然后基于知名开源CI/CD工具jenkins进行实…...

MySQL 索引(B+树)详解
MySQL 索引(B树)详解 MySQL逻辑架构对比InnoDB与MyISAM存储结构存储空间可移植性、备份及恢复事务支持AUTO_INCREMENT表锁差异全文索引表主键表的具体行数CRUD操作外键 sql优化简介什么情况下进行sql优化sql语句执行过程sql优化就是优化索引 索引索引的优…...

医疗系统国产数据库高质量发展路径探析
信息工程人员操作数据库 一、国外数据库在医疗系统中的困境 (一)数据分散与难以整合 在美国,分散式医疗服务成为癌症研究数据库优化的巨大障碍。患者先在社区接受肿瘤科医生常规检查,再到学术医疗中心进行尖端治疗,然…...

微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档
要解决此问题,需打开微信小程序开发者工具进行设置,打开详情-本地设置重新运行,该报错就没有啦...

智能租赁管理系统助力规范化住房租赁市场提升用户体验
内容概要 在当今的住房租赁市场中,智能租赁管理系统应运而生,为房东和租客带来了前所未有的便利。这套系统就像一位全能助手,将租赁信息、监管机制以及在线签约功能集成在一起,让整个过程变得流畅而高效。换句话说,您…...

MicroBlaze软核开发(一):Hello World
实现功能:使用 MicroBlaze软核 串口打印 Hello World Vivado版本:2018.3 目录 MicroBlaze介绍 vivado部分: 一、新建工程 二、配置MicroBlaze 三、添加Uart串口IP 四、生成HDL文件编译 SDK部分: 一、导出硬件启动SDK 二、…...

跟着问题学15——GRU网络结构详解及代码实战
1 RNN的缺陷——长期依赖的问题 (The Problem of Long-Term Dependencies) 前面一节我们学习了RNN神经网络,它可以用来处理序列型的数据,比如一段文字,视频等等。RNN网络的基本单元如下图所示,可以将前面的…...

【uniapp】swiper切换时,v-for重新渲染页面导致文字在视觉上的拉扯问题
问题描述 先用v-for渲染了几个列表,但这几个列表是占同一个位置的,只是通过切换swiper来显示哪个列表显示,也就是为了优化页面切换时候,没有根据swiper的current再更新v-for的数据,但现在就有个问题,怎么隐…...

【Android】Compose初识
文章目录 1.Compose是什么2.Compose优势3.可组合函数4.布局5.配置布局6.Material Design7.列表与动画8.声明式UI9.组合10.重组 1.Compose是什么 Jetpack Compose是谷歌开发的一个现代的、声明式的UI工具包,用于构建原生的Android应用程序界面。它简化了创建复杂用户…...

前端工程化面试题(二)
前端模块化标准 CJS、ESM 和 UMD 的区别 CJS(CommonJS)、ESM(ESModule)和UMD(Universal Module Definition)是前端模块化标准的三种主要形式,它们各自有不同的特点和使用场景: CJS&…...

以攻击者的视角进行软件安全防护
1. 前言 孙子曰:知彼知己者,百战不殆;不知彼而知己,一胜一负,不知彼,不知己,每战必殆。 摘自《 孙子兵法谋攻篇 》在2500 年前的那个波澜壮阔的春秋战国时代,孙子兵法的这段话&…...

008.精读《Apache Paimon Docs - Table w/o PK》
文章目录 1. 引言2. 基本概念2.1 定义2.2 使用场景 3. 流式处理3.1 自动小文件合并3.2 流式查询 4. 数据更新4.1 查询4.2 更新4.3 分桶附加表 5 总结 1. 引言 通过本文,上篇我们了解了Apache Paimon 主键表,本期我们将继续学习附加表(Append…...

C#实时监控指定文件夹中的动态,并将文件夹中生成的新图片显示在界面上(相机采图,并且从本地拿图)
结果展示 此类原理适用于文件夹中自动生成图片,并提取最新生成的图片将其显示, 如果你是相机采图将其保存到本地,可以用这中方法可视化,并将检测的结果和图片匹配 理论上任何文件都是可以监视并显示的,我这里只是做了…...

使用SQLark分析达梦慢SQL执行计划的一次实践
最近刚参加完达梦的 DCP 培训与考试,正好业务系统有个 sql 查询较慢,就想着练练手。 在深入了解达梦的过程中,发现达梦新出了一款叫 SQLark 百灵连接的工具。 我首先去官网大致浏览了下。虽然 SQLark 在功能深度上不如 DM Manager 和 PL/SQ…...

【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 数据标注是构建高质量机器学习模型的关键环节,但其耗时耗力常成为制约因素。本篇文章将介绍如何用Python构建一个自动化数据标注工具,结合机器学习和NLP技术,帮助加速数据标注过程。我们将从需求分析入…...

Java --- 注解(Annotation)
一.什么是注解? 在Java中,注解(Annotation)是一种元数据(metadata),它为程序中的类、方法、字段等提供额外的描述信息。注解本身不直接改变程序的行为,但可以被编译器、开发工具、框…...