当前位置: 首页 > news >正文

html:文件上传-一次性可上传多个文件,将文件展示到页面(可删除

一、原始上传样式

1、效果

2、完整代码 

<!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>/* 文件展示容器样式 */.file-preview-container {display: flex;flex-wrap: wrap;/* 换行 */gap: 10px;/* 小块之间的间距 */margin-top: 10px;}/* 文件小块样式 */.file-preview-item {display: flex;align-items: center;background-color: #f0f0f0;border: 1px solid #ccc;border-radius: 4px;padding: 5px 10px;font-size: 14px;white-space: nowrap;/* 防止文件名换行 */}/* 删除按钮样式 */.file-preview-item .delete-btn {margin-left: 10px;color: red;cursor: pointer;font-weight: bold;}</style>
</head><body><form id="uploadForm" action="upload.php" method="post" enctype="multipart/form-data"><label for="files">选择多个文件:</label><input type="file" name="files[]" id="files" multiple><br><br><!-- 文件展示区域 --><div id="file-preview-container" class="file-preview-container"></div><button type="submit">上传</button></form><script>document.addEventListener("DOMContentLoaded", function () {const fileInput = document.getElementById("files");const filePreviewContainer = document.getElementById("file-preview-container");const uploadForm = document.getElementById("uploadForm");// 存储选中的文件let selectedFiles = [];// 监听文件输入框的变化fileInput.addEventListener("change", function (event) {const files = Array.from(event.target.files); // 获取选中的文件列表// 清空之前的预览filePreviewContainer.innerHTML = "";selectedFiles = [];// 遍历文件并生成小块files.forEach((file) => {// 创建文件小块const fileItem = document.createElement("div");fileItem.className = "file-preview-item";fileItem.dataset.fileName = file.name; // 保存文件名作为标识// 显示文件名fileItem.innerHTML = `${file.name}<span class="delete-btn" onclick="removeFile('${file.name}')">&times;</span>`;// 添加到预览容器filePreviewContainer.appendChild(fileItem);// 将文件存入数组selectedFiles.push(file);});});// 删除文件的函数window.removeFile = function (fileName) {// 从数组中移除文件selectedFiles = selectedFiles.filter((file) => file.name !== fileName);// 从 DOM 中移除对应的小块const fileItem = document.querySelector(`.file-preview-item[data-file-name="${fileName}"]`);if (fileItem) {fileItem.remove();}};// 拦截表单提交事件uploadForm.addEventListener("submit", function (event) {event.preventDefault(); // 阻止表单默认提交行为// 构造 FormData 对象const formData = new FormData();// 将选中的文件添加到 FormData 中selectedFiles.forEach((file, index) => {formData.append("files[]", file); // 注意这里的键名要和服务器端一致});console.log(selectedFiles);// 使用 AJAX 提交文件// fetch("upload.php", {//     method: "POST",//     body: formData,// })//     .then(response => response.text())//     .then(data => {//         console.log("上传成功:", data);//         alert("文件上传成功!");//     })//     .catch(error => {//         console.error("上传失败:", error);//         alert("文件上传失败!");//     });});});</script>
</body></html>

二、扩展-隐藏原文件上传效果

1、效果

2、完整代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title><style>/* 隐藏原生文件输入框 */#files {display: none;}/* 自定义按钮样式 */.custom-file-button,button {display: inline-block;padding: 10px 20px;background-color: #42b983;color: white;border-radius: 5px;cursor: pointer;font-size: 16px;border: none;}/* 文件展示容器样式 */.file-preview-container {display: flex;flex-wrap: wrap; /* 换行 */gap: 10px; /* 小块之间的间距 */margin-top: 10px;}/* 文件小块样式 */.file-preview-item {display: flex;align-items: center;background-color: #f0f0f0;border: 1px solid #ccc;border-radius: 4px;padding: 5px 10px;font-size: 14px;white-space: nowrap; /* 防止文件名换行 */}/* 删除按钮样式 */.file-preview-item .delete-btn {margin-left: 10px;color: red;cursor: pointer;font-weight: bold;}</style>
</head><body><form id="uploadForm" action="upload.php" method="post" enctype="multipart/form-data"><!-- 自定义文件选择按钮 --><label for="files" class="custom-file-button">选择文件</label><input type="file" name="files[]" id="files" multiple><br><br><!-- 文件展示区域 --><div id="file-preview-container" class="file-preview-container"></div><br><br><button type="submit">上传</button></form><script>document.addEventListener("DOMContentLoaded", function () {const fileInput = document.getElementById("files");const filePreviewContainer = document.getElementById("file-preview-container");const uploadForm = document.getElementById("uploadForm");// 存储选中的文件let selectedFiles = [];// 监听文件输入框的变化fileInput.addEventListener("change", function (event) {const files = Array.from(event.target.files); // 获取选中的文件列表// 清空之前的预览filePreviewContainer.innerHTML = "";selectedFiles = [];// 遍历文件并生成小块files.forEach((file) => {// 创建文件小块const fileItem = document.createElement("div");fileItem.className = "file-preview-item";fileItem.dataset.fileName = file.name; // 保存文件名作为标识// 显示文件名fileItem.innerHTML = `${file.name}<span class="delete-btn" onclick="removeFile('${file.name}')">&times;</span>`;// 添加到预览容器filePreviewContainer.appendChild(fileItem);// 将文件存入数组selectedFiles.push(file);});});// 删除文件的函数window.removeFile = function (fileName) {// 从数组中移除文件selectedFiles = selectedFiles.filter((file) => file.name !== fileName);// 从 DOM 中移除对应的小块const fileItem = document.querySelector(`.file-preview-item[data-file-name="${fileName}"]`);if (fileItem) {fileItem.remove();}};// 拦截表单提交事件uploadForm.addEventListener("submit", function (event) {event.preventDefault(); // 阻止表单默认提交行为// 构造 FormData 对象const formData = new FormData();// 将选中的文件添加到 FormData 中selectedFiles.forEach((file, index) => {formData.append("files[]", file); // 注意这里的键名要和服务器端一致});console.log(selectedFiles);// 使用 AJAX 提交文件// fetch("upload.php", {//     method: "POST",//     body: formData,// })//     .then(response => response.text())//     .then(data => {//         console.log("上传成功:", data);//         alert("文件上传成功!");//     })//     .catch(error => {//         console.error("上传失败:", error);//         alert("文件上传失败!");//     });});});</script>
</body></html>

相关文章:

  • 语音识别——根据声波能量、VAD 和 频谱分析周围是否有人说话
  • 驾驭 Linux 云: JavaWeb 项目安全部署
  • leetcode第二题
  • 循环神经网络 - 门控循环单元网络之参数学习
  • UE5 Chaos :渲染网格体 (Render Mesh) 和模拟网格体 是如何关联的?为什么模拟网格体 可以驱动渲染网格体?
  • Terraform 迷思:当优雅的模块 terraform-aws-eks 与现实碰撞
  • 【机器学习】机器学习笔记
  • 【Linux网络编程】TCP Echo Server的实现
  • 电梯设备与电源滤波器:现代建筑中的安全守护者与电力净化师
  • TDengine 语言连接器(Node.js)
  • 【uni-app】axios 报错:Error: Adapter ‘http‘ is not available in the build
  • cursor如何集成MCP服务
  • 爬虫: 一文掌握 pycurl 的详细使用(更接近底层,性能更高)
  • oracle查询锁表和解锁
  • 第十八讲 | 支持向量机(SVM):在地类识别与遥感影像分类中的应用
  • Spark-SQL简介及核心编程
  • [AI ][Dify] 构建一个自动化新闻编辑助手:Dify 工作流实战指南
  • Spark-SQL核心编程(一)
  • Java 设计模式:组合模式详解
  • 体系结构论文(六十七):A Machine-Learning-Guided Framework for Fault-Tolerant DNNs
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等
  • 汇源果汁发文:经营情况一切正常
  • 云南省安委会办公室:大理州安全生产形势比较严峻,事故总量一直居高不下
  • 外交部:习近平主席同普京总统达成许多新的重要共识
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • A股三大股指低收:银行股再度走强,两市成交11920亿元