0

0

使用 jQuery 实现多文件上传预览与删除功能

碧海醫心

碧海醫心

发布时间:2025-11-22 15:28:14

|

811人浏览过

|

来源于php中文网

原创

使用 jquery 实现多文件上传预览与删除功能

本教程详细介绍了如何使用 HTML、CSS 和 jQuery 构建一个用户友好的多文件上传界面。该界面支持实时预览图片和 PDF 文件,并允许用户在上传前删除不需要的文件,同时兼顾了前端交互逻辑和样式设计,为后端文件处理奠定了基础。

在现代 Web 应用中,用户上传多个文件(如图片、文档)并能实时预览和管理这些文件是常见的需求。本教程将指导您如何利用 jQuery 实现一个功能完善的多文件上传组件,该组件不仅提供文件预览,还允许用户在提交前删除已选择的文件,提升用户体验。

核心功能概览

我们将构建的组件具备以下核心功能:

  1. 多文件选择:通过一个隐藏的 元素实现。
  2. 实时预览:当用户选择文件后,立即在页面上显示图片的缩略图或 PDF 文件的通用图标。
  3. 文件类型支持:支持常见的图片格式(JPEG, JPG, PNG)和 PDF 文件。
  4. 文件删除:每个预览项都带有一个删除按钮,允许用户移除不需要的文件。
  5. 文件数量限制:通过 data-max_length 属性控制最大可上传文件数量。

1. HTML 结构

首先,我们需要定义页面的基本 HTML 结构,包括上传按钮和用于显示文件预览的容器。

结构说明:

  • upload__box:整个上传区域的容器。
  • upload__btn-box:包含上传按钮的容器。
  • upload__btn:自定义的上传按钮样式,通过 label 标签关联到隐藏的 input。
  • upload__inputfile:实际的文件输入框。
    • multiple="":允许选择多个文件。
    • id="files" 和 name="files[]":用于后端接收文件数组。
    • data-max_length="20":自定义属性,用于前端限制最大上传文件数量。
    • accept="image/jpeg, image/jpg, image/png, application/pdf":限制可选的文件类型。
  • upload__img-wrap:用于显示文件预览的容器。

2. CSS 样式

为了美化上传界面并隐藏原生文件输入框,我们需要添加一些 CSS 样式。

样式说明:

  • upload__inputfile:设置为 opacity: 0 和 position: absolute 来隐藏原生文件输入框,并通过 label 触发其点击事件。
  • upload__btn:自定义了上传按钮的样式,使其看起来更友好。
  • upload__img-wrap:使用 Flexbox 布局来排列预览图片。
  • upload__img-box:每个文件预览项的容器。
  • img-bg:用于显示图片预览的背景,通过 padding-bottom: 100% 技巧创建响应式的正方形区域。
  • upload__img-close:预览图片上的删除按钮样式。

3. JavaScript 逻辑 (jQuery)

核心功能将通过 jQuery 实现,包括文件选择监听、预览生成和文件删除。

网趣网上购物系统旗舰版
网趣网上购物系统旗舰版

网趣网上购物系统支持PC电脑版+手机版+APP,数据一站式更新,支持微信支付与支付宝支付接口,是专业的网上商城系统,网趣商城系统支持淘宝数据包导入,实现与淘宝同步更新!支持上传图片水印设置、图片批量上传功能,同时支持订单二次编辑以及多级分类隐藏等实用功能,新版增加商品大图浏览与列表显示功能,使分类浏览更方便,支持最新的支付宝即时到帐接口。

下载

JavaScript 逻辑说明:

  1. $(document).ready(function () { ImgUpload(); });: 页面加载完成后调用 ImgUpload 函数初始化功能。
  2. ImgUpload() 函数:
    • imgArray = []:一个全局数组,用于存储用户选择的所有 File 对象。这个数组最终可以用于通过 AJAX 发送到后端。
    • 文件选择监听 (.upload__inputfile').on('change', ...):
      • 获取 data-max_length 属性来限制文件数量。
      • e.target.files 获取用户选择的文件列表。
      • 将 FileList 转换为数组 filesArr,方便遍历。
      • 遍历 filesArr 中的每个文件:
        • 文件数量检查:在添加新文件前,检查 imgArray.length 是否已达到 maxLength。
        • imgArray.push(f):将当前文件对象添加到 imgArray。
        • FileReader:用于异步读取文件内容。
          • reader.onload:当文件读取完成后触发。
          • 根据 f.type 判断文件类型:
            • 如果是 application/pdf,则显示一个预设的 PDF 图标。
            • 否则(假定是图片),将 e.target.result (Data URL) 作为背景图片显示。
          • 生成的 HTML 包含一个 data-file 属性,存储文件名,用于后续删除操作。
          • imgWrap.append(html):将生成的预览 HTML 添加到页面。
        • reader.readAsDataURL(f):开始读取文件内容。
      • $(this).val(''):清空文件输入框的值,这样即使再次选择相同的文件,change 事件也能被触发。
    • 文件删除监听 ($('body').on('click', ".upload__img-close", ...)):
      • 使用事件委托 ($('body').on(...)) 来监听动态生成的删除按钮的点击事件。
      • $(this).parent().data("file"):获取要删除的文件名。
      • 遍历 imgArray,找到匹配文件名的文件并使用 splice 移除。
      • $(this).parent().parent().remove():从 DOM 中移除对应的预览元素。

4. 注意事项

  • 后端处理: 本教程主要关注前端交互。当用户最终提交表单时,您需要通过 AJAX 将 imgArray 中的文件发送到后端(例如 Laravel)。在 Laravel 中,您可以通过 FormData 对象来处理文件上传。

    // 示例:使用 FormData 和 AJAX 发送文件
    var formData = new FormData();
    for (var i = 0; i < imgArray.length; i++) {
        formData.append('files[]', imgArray[i]);
    }
    // 假设您还有其他表单数据
    // formData.append('other_field', $('#other_field_id').val());
    
    $.ajax({
        url: '/upload-endpoint', // 您的后端上传接口
        type: 'POST',
        data: formData,
        processData: false, // 告诉 jQuery 不要处理数据
        contentType: false, // 告诉 jQuery 不要设置 Content-Type 请求头
        success: function(response) {
            console.log('上传成功', response);
            // 处理成功后的逻辑
        },
        error: function(xhr, status, error) {
            console.error('上传失败', error);
            // 处理失败后的逻辑
        }
    });
  • 文件类型与大小验证:

    • 前端的 accept 属性和 JavaScript 检查只是初步的用户体验优化,绝不能替代后端验证。后端必须对文件类型、大小、数量进行严格验证,以防止恶意文件上传和服务器资源滥用。
    • 您可以在 FileReader 之前添加更多 JavaScript 验证,例如检查文件大小。
  • 用户体验:

    • 考虑添加上传进度条或加载指示器,尤其是在文件较大或网络较慢的情况下。
    • 对错误情况(如上传失败、文件类型不匹配)提供清晰的用户反馈。
  • 安全性: 永远不要相信来自前端的数据。所有文件上传都必须在后端进行严格的验证和安全检查。

总结

通过结合 HTML 结构、CSS 样式和 jQuery 提供的强大 DOM 操作能力,我们成功构建了一个功能丰富且用户友好的多文件上传组件。这个组件不仅提供了实时预览和删除功能,还通过 imgArray 有效地管理了待上传的文件,为后续的后端集成奠定了坚实的基础。您可以根据自己的项目需求进一步扩展和优化此组件,例如添加拖拽上传、进度显示等高级功能。

使用 jQuery 实现多文件上传预览与删除功能

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

321

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

281

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

435

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

374

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

86

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

72

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

68

2025.08.05

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

151

2023.09.12

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 27万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号