H5 多文件Input样式和上传(多次添加,随意删除,名称显示)

H5开发:使用H5、CSS、JS、JQUERY实现从本地选择图片、预览图片、上传图片列表 使用H5、CSS、JS、JQUERY实现从本地选择图片、预览图片、上传图片列表 阅读详情

H5 多文件Input样式和上传(多次添加,随意删除,名称显示)

一、使用场景

  1. H5界面使用!!!Vue等其他前端都有很好的方式,不需要看这个。
    • 需要多个文件上传时,原始的Input type=file 存在的问题有:
      1.必须一次性选择多个文件,如果遇到文件不在同一个文件夹就比较麻烦。
      2.第二次选择的文件会覆盖第一次的选择的文件。
      3.多个文件时不会显示文件名称,只会显示文件数量。
      4.选择完后不能随意删除,必须重新选择等等问题。

    • 所以如果遇到以上问题,是可以使用这个代码的。

  2. 看样式
    • 没有文件选择时:在这里插入图片描述

    • 选择文件时:在这里插入图片描述


话不多说,直接上代码

二、代码实现

H5及JS代码(整个页面代码,可以直接复制到HTML5界面打开看)

代码里有button的样式,文件名显示、删除的js,以及文件提交到后端的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传测试</title>
    <style type="text/css">
        .file {
            position: relative;
            display: inline-block;
            background: #D0EEFF;
            border: 1px solid #99D3F5;
            border-radius: 4px;
            padding: 4px 12px;
            overflow: hidden;
            color: #1E88C7;
            text-decoration: none;
            text-indent: 0;
            line-height: 20px;
        }
        .file input {
            position: absolute;
            font-size: 100px;
            right: 0;
            top: 0;
            opacity: 0;
        }
        .file:hover {
            background: #AADFFD;
            border-color: #78C3F3;
            color: #004974;
            text-decoration: none;
        }
    </style>
</head>
<body>
<div>
    <a href="javascript:;" class="file">文件上传
        <input type="file" name="clientInfoFile" id="filesInput" multiple
               accept="image/jpeg, image/jpg, image/png, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document">
    </a>
    <a onclick="save()" class="file">保存
        <input type="button">
    </a>
    <div>
        <span id="totalFileSpan" class="hidden"></span>
        <div id="selectedFiles"></div>
    </div>
</div>


<!--如果使用$.ajax,请在这里更换上自己的jquery.js或者使用网上的juqey.js-->
<!--<script src="path/jquery.js"></script>-->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>


<script>
    //全局已选择文件列表
    var fileList = new Map();
    // 获取input框的dom元素
    var filesInput = document.getElementById('filesInput');
    //获取展示文件的input框元素
    var selectedFilesDiv = document.getElementById('selectedFiles');
    //给input框添加监听时间
    filesInput.addEventListener('change', updateSelectedFilesList);


    // 当选择文件时的监听时间
    function updateSelectedFilesList(event) {
        Array.from(event.target.files).forEach((file) => {
            //判断是否有重名文件,有的话直接返回并弹出提示
            for (var key of fileList.keys()) {
                if(key.firstElementChild.title == file.name){
                    // $.modal.alertWarning('禁止重复上传文件');
                    return;
                }
            }
            //创建显示文件信息的组件div
            var fileItem = document.createElement('div');
            //设置名称长度,过长给省略掉
            var fileName = file.name.length > 50 ? file.name.substring(0, 50) + '...' : file.name;
            //设置样式
            fileItem.className = 'file-item';
            //名称
            fileItem.innerHTML = '<span title="' + file.name + '">' + fileName + '</span>'
            //创建删除按钮及样式
            var deleteBtn = document.createElement('a');
            deleteBtn.style = "margin-left : 20px";
            deleteBtn.innerHTML = '删除';
            //不加href没有下划线,这个可以自定义加不加
            deleteBtn.href = "#"
            //给删除按钮添加click事件
            deleteBtn.addEventListener('click', function() {
                fileList.delete(fileItem)
                fileItem.remove();
                updateTotalFileSpan();
            });
            //把按钮添加到文件名称后面
            fileItem.appendChild(deleteBtn);
            //再把所有组件添加到展示文件的组件下
            selectedFilesDiv.appendChild(fileItem);
            //给fileList赋值,保存文件信息
            fileList.set(fileItem,file)
        });
        updateTotalFileSpan();
    }
    //更改文件数量
    function updateTotalFileSpan() {
        //获取显示文件数量的标签组件
        let totalFileSpan = document.getElementById("totalFileSpan")
        if(fileList.size > 0){
            let fileSizeValue  = "已选择"+ fileList.size + "个文件";
            totalFileSpan.classList.remove("hidden")
            totalFileSpan.textContent = fileSizeValue
        }else {
            totalFileSpan.classList.add("hidden");
            totalFileSpan.textContent = ""
        }
        console.log(fileList)
    }

    function save() {
        //创建ajax传输参数所需的FormData
        //其他参数也可以在这里添加,直接使用formData.append("参数名","参数值")就行
        let formData = new FormData();
        //获取文件列表
        let files = [];
        for (let value of fileList.values()) {
            files.push(value);
        }
        for (var i = 0; i < files.length; i++) {
            //有需求可以在这里对每个文件做处理,没需求可以直接添加
            formData.append('files', files[i]); // 将每个文件添加到数组参数中
        }
        //这里我用的是Jquery.js 中的 $.ajax请求,也可以更改为原生的new XMLHttpRequest()请求方式
        $.ajax({
            cache: true,
            type: "POST",
            url: prefix + "/save", //prefix是前缀地址,这里可以换成自己的地址
            contentType: false, //必须要加, 不设置 contentType 属性,让浏览器自动识别
            processData: false, //必须要加, 不处理发送的数据,让浏览器自动处理
            data: formData,//上面定义的数据
            async: true,
            beforeSend: function () {
                debugger
                // 提交之前方法,一般加遮盖层
                // $.modal.loading("正在处理中,请稍后...");
            },
            error : function(request) {
                // 提交返回失败方法
                // $.modal.closeLoading();
                // $.modal.alertError("系统错误");
            },
            success: function(data) {
                // 提交成功方法
                // $.modal.closeLoading();
                // $.operate.successCallback(data);
            }
        });
    }
</script>
</body>
</html>

JAVA后端接收文件

@RequestMapping(value = "/save",method = RequestMethod.POST)
@ResponseBody
public AjaxResult save(@RequestParam(value = "files", required = false) List<MultipartFile> files, @RequestParam("params", required = false) String params) {
    //AjaxResult是返回类,可以换成自己需要的返回类,比如JSONResult,或者任意类型,拿到前端处理就行
        try {
            //文件处理,方法自己添加
            doFiles();
            //其他参数处理,方法自己添加
            doParams();
        } catch (Exception e) {
            return AjaxResult.error("保存异常!");
        }
    return AjaxResult.success();
 }

总结

  1. 原始button样式比较丑并且使用起来复杂,用这个方法样式好看、可以清楚的看到已选择的文件和数量,并且可以随意增删!
  2. 文件上传的代码也比较简单,可以自己添加和修改,还是比较方便的!

如果需要图片预览和文件下载功能,可以看一下另一篇文章,实现多文件的预览和下载。

H5多文件Input样式及文件上传

🙉在小小的电脑上面敲呀敲呀敲,写短短的代码,埋小小的坑🙈

🙉在大大的电脑上面敲呀敲呀敲,写大大的代码,埋大大的坑🙈

🙉在特别大的电脑上面敲呀敲呀敲,写特别大的代码,埋特别大的坑🙈

🙉优秀的你肯定是一个不爱写Bug并且爱点赞关注的靓仔吧!🙈

移动端H5 图片/视频上传预览(不依赖于任何框架)--input:file总结 写在前面: 这里先来介绍下input:file的几个属性: accept:规定通过文件上传来提交的文件的类型。 capture:该属性用于调用设备的摄像头或麦克风。 multiple:可勾选多文件,调用系统摄像头或者录音机都只是单文件。 一、常规上传(选取本地的图片/视频文件进行上传) <!DOCTYPE html> <html> <head> <m... 阅读详情

相关推荐

php+fileInput+bootstrap实现多文件上传预览删除功能

【代码】php+fileInput+bootstrap实现多文件上传预览删除功能。

a187107的博客 884

input详解之文件上传

小菜鸟在摸鱼

MoXinXueWEB的博客 1万+

汇川H5U与威纶通触摸屏标签通讯实战指南

标签通讯是工业HMI与PLC数据交互的基础技术,其本质是通过结构化变量名实现内存地址的跨设备映射,依赖协议一致性、地址精确换算与数据类型严格匹配。在Modbus TCP框架下,汇川H5U默认采用小端序、私有报文头及DB块直映射机制,与威纶通标准Modbus驱动存在天然兼容风险;而‘汇川h5u’与‘威纶通触摸屏 通过网线 进行modbus tcp通讯时 元件地址’等高频搜索问题,集中暴露于字节序错位、寄存器偏移误算、BOOL/REAL类型解析失配等底层细节。该技术广泛应用于包装、装配、输送等产线监控场景,是电

weixin_34357436的博客 275

Input实现多个文件上传以及文件夹上传

日常中,出来Element UI中Upload 上传组件以外,input也可以实现上传文件,它可以上传文件夹、单个文件以及多个文件。

EvaY_Yang的博客 1万+

UniApp微信小程序头像上传:从chooseAvatar到隐私合规的完整实战指南

在移动应用开发中,文件上传是常见的功能需求,其核心原理涉及前端文件选择、临时文件处理、网络传输与服务器端存储。随着平台对用户隐私保护的日益重视,技术实现必须与合规要求紧密结合,才能创造安全可靠的产品价值。特别是在微信小程序生态中,用户头像等敏感信息的获取,已从单纯的技术调用演变为一套涵盖API权限声明、隐私协议配置、前端交互与后端处理的完整流程。本文聚焦于UniApp跨端开发场景,深入解析如何正确使用`chooseAvatar`按钮组件与`chooseImage`API,并遵循平台规范,构建一个合法合规的用

weixin_33701294的博客 396

实现简洁的文件上传表单样式(使用 jQuery 和 JavaScript)

在上面的代码中,我们使用 jQuery 来监听文件输入框的变化事件。为了改善文件上传表单的样式,我们可以使用 jQuery 和 JavaScript 来自定义表单样式,使其更加简洁和美观。至此,我们已经完成了使用 jQuery 和 JavaScript 实现简洁文件上传表单样式的步骤和源代码。在上面的代码中,我们定义了一些基本的样式,包括容器的位置和显示方式,文件标签和上传按钮的背景颜色、字体颜色和鼠标指针样式等。在上面的代码中,我们创建了一个包含文件输入框、标签、文件名和上传按钮的容器。

CodeWhizZ的博客 338

表单(包含H5新增)

表单一.创建表单1. form标签2.method属性2-1.get2-2.post二.表单控件1.输入框inputtypenamevalueplaceholder1-1.去点击时的边框2.提交按钮button3.文本框textarea4.label标签5.select配合 option 下拉菜单6.fieldset 搭配legend实现表头行内有文字.三.H5新增(IE兼容性差)1.表单标签1-1.数据列表(类似百度搜索时出现的信息提示框)1-2.输出框2.表单属性2-1.邮件 type="email"

箜的博客 692

Linux CentOS 8系统离线升级内核版本

CentOS 8操作系统离线场景下升级内核版本

WQwinter的博客 3237

如何实现上传多个图片并依次展示_Html5实现单张、多张图片上传功能

前言今天我们聊一聊图片上传,单张Or多张 ,如今,各大图片上传插件数不胜数,例如:Jquery的 verupload.js,jQuery File Upload、Uploadify、jQuery.filter等等。But。上面说到的这些插件,今天我们不谈,我们来看一看使用HTML5中的FileReader 如何实现 图片的单张及多张预览、删除、上传等功能。先看下实现后的效果如下:2|0实现2|1前...

weixin_42318815的博客 3690

时钟MUX电路结构的时序约束方法分析

一、最简单的设置 对于时钟MUX而言,其output_pin上的时钟在任一时刻一定唯一。可以使用如下命令: set_clock_exclusivity -output output_pin [-type mux | user_defined] ...

Jackiezhang1993的博客 1万+

ROS2+MoveIt2+Gazebo仿真实战:从零搭建六轴机械臂控制闭环

本文详细介绍了如何从零搭建一个完整的ROS2+MoveIt2+Gazebo六轴机械臂仿真控制闭环。通过手写URDF模型、配置MoveIt2运动规划、集成Gazebo物理仿真与ROS2 Control控制器,最终实现RViz中规划轨迹、Gazebo中同步执行的完整数字孪生验证平台,为机器人算法开发和硬件验证提供低成本、高效的仿真解决方案。

weixin_29093017的博客 484

H5 宿主 APP 附件上传:WebView 文件选择与分片续传实践

移动端混合开发中,H5 常运行在宿主 APP 的 WebView 容器里,文件上传的起点并非普通浏览器,而是 Android 与 iOS 原生文件选择通道。理解 input file 到原生回传的链路,是解决点击无响应、临时路径失效、弱网超时的关键。工程实践中,图片压缩、EXIF 方向校正、HEIC 转码、分片上传与断点续传共同组成稳定管线,可降低流量与内存压力,提升弱网成功率。该能力广泛用于身份证、营业执照、合同扫描件等材料提交。围绕爱山东 APP 等宿主环境,结合 JSBridge 兜底、临时文件生命周

weixin_33836874的博客 284

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 715

angular 上传Excel

import { FileUploader } from 'ng2-file-upload'; this.uploader = new FileUploader({ url: this.importExcelUrl, method: 'POST', itemAlias: 'excel', }); // 选择的文件 selectedFileO...

_ZY 1249

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

h5与css

它的属性说明如下: name:用于表单提交是把数据提交到后端 id:给这个输入框一个唯一值,一般是用于 JavaScript 来获取它时所使用 value:它代表是这个输入框所输入的值 size:用于指定这个输入框的长度,不推荐使用,后续会用 CSS 来控制 maxlength:用于指定这个输入框所能输入值的最大的长度。size:用于指定可看选项个数,不重要,了解即可 子标签是 option,用于指定下拉选项,它的 value 属性用于指定这个选项的值。对于初学h5,我使用的工具是vscode,优点;

a1852384503的博客 372

128、点云配准与ICP:经典配准算法与深度学习配准

上周调试一台双臂协作机器人,左手持结构光相机扫描桌面上的随机堆叠工件,右手准备执行抓取。问题出在“对齐”这一步——相机扫描得到的点云和CAD模型点云之间差了大约15度的旋转,导致抓取姿态计算出来直接怼到桌面上。我第一反应是“ICP跑一下不就行了”,结果跑了三分钟,误差纹丝不动,甚至越迭代越发散。后来查了日志才发现,初始位姿给得太离谱,ICP直接掉进了局部最优。这个场景太典型了——很多人以为点云配准就是调个ICP库函数,实际工程里坑比想象中多得多。今天这篇笔记,咱们把点云配准这件事从头捋一遍。

sundong_81的博客 42

uni-file-picker跨端文件上传组件:从原理到实战的完整指南

在跨平台应用开发中,文件上传是一个常见且复杂的需求,涉及前端交互、平台差异处理和网络传输等多个环节。其核心原理在于通过统一的API抽象层来抹平不同操作系统和运行环境(如H5、小程序、App)的底层差异,实现一次开发、多端部署。这种设计为开发者带来了显著的技术价值:它极大地提升了开发效率,降低了维护成本,并保证了用户体验的一致性。在实际工程实践中,文件上传组件通常需要处理图片压缩、多文件并发控制、临时文件管理以及与后端API的对接等具体问题。uni-file-picker作为uni-app生态中的官方组件,正

chulilang8944的博客 492

用 C# 快速构建一套可扩展的上位机框架(实战+源码思想)

本文介绍了一套基于C#的工业上位机开发框架设计方案。该框架通过模块化设计解决了上位机开发中的常见痛点,包括协议适配、通信管理、UI绑定等问题。核心架构采用分层设计,包含协议接口层、调度器层、通信抽象层和UI层,支持MVVM模式。框架提供了协议插件化扩展能力,通过JSON配置实现设备协议定义,同时封装了日志管理、异常处理等基础功能。该方案具有快速搭建、协议驱动、UI分离等特点,可显著提升上位机开发效率,适用于串口、TCP等多种通信场景,并能快速适配新设备协议。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 884

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2、表格_表单_h5新增元素

2、表格_表单_h5新增元素

m0_58779986的博客 928

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

html常用标签和form表单

1、html常用标签 标签的结构: <标签名 属性="名称"></标签> 加粗-----b/strong 斜体------i/em 换行标签----br 水平分割线-----hr(属性:width:长短 size:粗细) 下划线-----u 删除线-----del 段落标签-----p align属性-----center left right font-----字体 颜色属性:color 字体大小属性:size 颜色表示法:英文单词:red green blu

D2961953033的博客 457

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

huggingface_hub 文件上传完全指南:从 upload_file 到 Xet 流式上传管线

向 Hugging Face Hub 共享文件与工作成果是 Hub 生态中至关重要的一环。`huggingface_hub` 为上传文件提供了从单个文件到超大文件夹、从同步调用到后台定时提交、从高层便捷 API 到底层 commit 级操作的一整套方案,并且可以独立使用或深度集成进你自己的库。读完本文,你将掌握:如何使用 `upload_file` / `upload_folder` 上传文件与文

gitblog_00858的博客 942

uniapp - 笔记

页面刷新后无法返回上一页面、安卓滚动条不隐藏、隐藏vue中普通元素的滚动条、css获取底部安全栏高度、小程序自动刷新当前页面、获取状态栏、胶囊高度(自定义导航栏)、input传参、点击查看位置、批量获取元素信息并滚动至其位置、webSocket超出次数、 h5跳转其它网页、h5保存网络图片、上传文件请求封装、背景部分渐变、uni小程序中用户权限打开提示

m0_56597301的博客 471

tdesign-miniprogram Upload 上传组件详解:uni-app 下的媒体选择、状态管理、拖拽排序与自定义上传

本篇基于 tdesign-miniprogram 仓库 `packages/uniapp-components/upload` 的官方文档与源码,系统讲解 Upload 组件在 uni-app / 微信小程序中的完整用法:从 easycom 引入与单选/多选图片上传,到 `loading/reload/failed` 状态机、`sizeLimit` 体积限制、长按拖拽排序、`source="mes

gitblog_01023的博客 96

HTML总结【表格标签和表单标签】

HTML中table标签和form标签属性、子标签介绍

Jiayou9933的博客 2669
上一篇: H5界面预览或下载文件(Minio或本地文件)
下一篇: springboot的kafka动态工具类(动态创建topic、监听和监听方法)
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值