多文件上传关于input type=file元素

2023-11-15

我们都知道,html5中有个input type=file元素。用该元素可以实现页面上传文件的功能

但一般的做法只是简单的在表单中操作,我来研究一下深层东西

想要了解它,就要知道它的内置对象,files

页面上写一个input,然后选俩个图片,打印这个input对象

$("input[name='file1']").change( function(e){
    console.log($("input[name='file1']"))
})

发现有下列值,在0中,有一个files对象
在这里插入图片描述
在这里插入图片描述

我们发现input选择的文件被记录到了这个对象中,这个是fileList对象,是一个只读对象,不能修改

因为它不能修改,所以很难实现对已选中多个文件的删除某个文件等操作

里面记录了文件的name,size,type,和修改时间等,可知这个对象只存放了一些文件的信息,相当于是本地文件的索引,并不是把文件放到input中了,上传文件时它会再去找到实际的本地文件

利用这个files对象,我们可以实现很多功能,例如:

一.选择图片未经后端显示预览图片

方法1:利用window的url工具将文件生成url,再将url赋值给img的src属性,显示出选中图像

顺便提一下,input中控制选中类型加一个accept属性就行了,只会显示设定的文件类型

$('.fbpj-camera').change(function(event) {
	 	//$('.dianpuzhuangxiu .addmokuai .block .shuoming1 .pic .pic1').children().remove();
   		 // 根据这个 <input> 获取文件的 HTML5 js 对象
	    var files = event.target.files, file;        
	    if (files && files.length > 0) {
	      // 获取目前上传的文件
	      file = files[0];
	      // 来在控制台看看到底这个对象是什么
	      console.log(file);
	      // 那么我们可以做一下诸如文件大小校验的动作
	      if(file.size > 1024 * 1024 * 2) {
	        alert('图片大小不能超过 2MB!');
	        return false;
	      }
	      // !!!!!!
	      // 下面是关键的关键,通过这个 file 对象生成一个可用的图像 URL
	      // 获取 window 的 URL 工具     
	      var URL = window.URL || window.webkitURL;     
	      // 通过 file 生成目标 url
	      var imgURL = URL.createObjectURL(file);
	      // 用这个 URL 产生一个 <img> 将其显示出来
	      $('.fbpj .container').prev().find("img").attr('src', imgURL);
	      // 使用下面这句可以在内存中释放对此 url 的伺服,跑了之后那个 URL 就无效了
	      	 //URL.revokeObjectURL(imgURL);
   		 }
  		});

方法二:利用html5的FileReader()读取文件

*前提是浏览器支持的话

if(window.FileReader) {  
    var fr = new FileReader();  
    // add your code here  
}  
else {  
    alert("Not supported by your browser!");  
} 

<script type="text/javascript">  
        function showPreview(source) {  
            var file = source.files[0];  
            if(window.FileReader) {  
                var fr = new FileReader();  
                fr.onloadend = function(e) {  
                    document.getElementById("portrait").src = e.target.result;  
                };  
                fr.readAsDataURL(file);  //也是利用将图片作为url读出
            }  
        }  
    </script>  
  
<input type="file" name="file" onchange="showPreview(this)" />  
                                <img id="portrait" src="" width="70" height="75">  

FileReader还有一些其他用法

<html>  
  <head>  
  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  <meta name="author" content="oscar999">  
  <title></title>  
  <script>  
  function  handleFiles(files)  
  {  
    if(files.length)  
    {  
       var file = files[0];  
       var reader = new FileReader();  
       reader.onload = function()  
       {  
           document.getElementById("filecontent").innerHTML = this.result;  
       };  
       reader.readAsText(file);   //作为字符串读出
    }  
  }  
  </script>  
    
  </head>  
  <body>  
  
  <input type="file" id="file" onchange="handleFiles(this.files)"/>  
  <div id="filecontent"></div>  
  </body>  
</html>  

二.文件拖拽的方法保存文件

关于文件拖拽下面有注释,我主要说一下怎么给用js给input赋值,而不是手动去选文件

因为拖拽的区域只是一个div,无法进行上传操作,所以需要加一个form和input,让拖拽进去的文件进入input中。

取出files后,用$("#file1")[0].files=files;将文件赋值给input,注意赋值的必须是fileList对象,不要试图只放进去一个文件,fileList只读。

然后用h5中的FormData将form转化,提交即可

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style>
        .container{
            width:300px;height: 300px;
            border:2px dashed #ddd;
            text-align: center;
            padding:50px;
        }
    </style>
    <title>
        培训活动列表
    </title>
</head>
<body>
<div class="container">
    拖拽进入
</div>
<form id="form1" method="post" enctype="multipart/form-data">
    <input type="file" name="file1" id="file1" value="" />
</form>
<script type="text/javascript">
    $('.container').bind('dragenter dragover', ignoreDrag);
    $(".container").on({drop:function(e){
        var flag=true;
        e.preventDefault();
        //jquery的file要去e.originalEvent里面拿,拖拽获取files的方式与input的不同
        var files = e.originalEvent.dataTransfer.files;
        //var files = e.dataTransfer.files;  原生的话这样就可以获取
        for(var i=0;i<files.length;i++){
            myFileReader(files[i],function(result,file){
                if(result){
                    //文件
                    console.log(file.name)
 
                }else{
                    //文件夹
                    console.log("不要上传文件夹")
                    flag=false;
                }
            });
        }
        if(flag){
            $("#file1")[0].files=files;   //关键:将取到的文件赋值给input,用于ajax提交文件!!!
            var formData = new FormData($("#form1")[0]);     
            $.ajax({
                url : "/it/orderManage/saveActivity",
                type : 'POST',
                data : formData,
                // 告诉jQuery不要去处理发送的数据
                processData : false,
                // 告诉jQuery不要去设置Content-Type请求头
                contentType : false,
                async : true,
                success : function(ret) {
                    //alert("上传成功")
                    if(ret){
                        $("#trainInfoModal").modal("hide");
                        layer.alert("保存成功")
                        $('#orderTable').bootstrapTable("refresh");
                        $("#trainInfoModal input").val("");
                        $("#trainInfoModal textarea").val("");
 
                    }
                }
            });
        }
        console.log(files);
    }})
 
    function ignoreDrag(e) {e.originalEvent.stopPropagation();
        e.originalEvent.preventDefault();
    }
 
    function myFileReader(file, callback){
        if(!window.FileReader){
            callback(true,file);
            return false;
        }
        var fr = new FileReader();
        fr.readAsDataURL(file);
        fr.function(e){
            callback(true,file);
        }
        fr.function(e){  //不好判断是否是文件夹,通过上传报错可以判断是文件夹
            callback(false,file);
        }
        return true;
    };
</script>
</body>
</html>

后台获取文件还是用MutipartFile[]接收

public String saveActivity(@RequestParam HashMap<String, String> param,
                               //@RequestParam(value = "banner") MultipartFile[] files,
                               @RequestParam(value = "file1") MultipartFile[] file1,
                               HttpServletRequest request,
                               String fileNames,
                               String TID, HttpServletRequest req) {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多文件上传关于input type=file元素 的相关文章

  • supervisor系列:4、子进程

    supervisor系列 4 子进程 文章目录 supervisor系列 4 子进程 1 非后台运行的子进程 1 1 程序配置示例 1 1 1 Apache 2 2 6 1 1 2 Two Zope 2 X instances and on
  • Windows命令行创建文件,文件夹,删除文件,文件夹命令

    创建文件夹命令 md 文件夹名字或者mkdir 文件夹名字 删除文件夹命令 rd删除空文件夹 rd s q 删除有子文件夹和子文件的文件夹 创建文件命令 type nul gt 可以带文件名 也可以不带文件名 这里用于空文件 echo 文件
  • mysql 常用函数

    一 mysql的函数 1 1 limit分页函数的使用 第一个起始的个数从0开始 第二个查询的个数 SELECT FROM student LIMIT 4 5 SELECT FROM student LIMIT 5 1 2 聚合函数 AVG
  • 【Linux】如何在进程间加锁(实现互斥)

    文章目录 前言 mmap 配合 pthread mutex t 先让多个进程能够看到一个num 多个进程互斥访问 具体代码 采用共享内存配合信号量 semget semctl semop 核心逻辑 管道 总结 前言 Linux 初识进程间通
  • python求一个整数的最大公约数_算法交流:7592 求最大公约数问题【2.1基本算法之递归和自调用函数】...

    题目描述 7592 求最大公约数问题 By OIer15WA给定两个正整数 求它们的最大公约数 输入输入一行 包含两个正整数 lt 1000000000 输出输出一个正整数 即这两个正整数的最大公约数 样例输入 6 9 样例输出 3 一 题
  • 《银河麒麟高级服务器操作系统V10》使用

    一言而论 讲了麒麟服务器V10的基本使用 包括终端 VNC 文章目录 前言 基本架构 环境 硬件环境 软件环境 麒麟安装步骤 1 在宿主机上安装好VM 并且激活 2 使用VM创建虚拟机 3 启动虚拟机 终端常用点 VNC的使用 麒麟上安装V
  • 关于MeasureSpec的一些理解

    MeasureSpec有以下三种模式 public static final int UNSPECIFIED 0 lt lt MODE SHIFT public static final int EXACTLY 1 lt lt MODE S
  • Qt编程(二)-初步进阶

    Qt编程 初步进阶 前言 一 Qt自定义信号和槽 1 自定义信号和槽 2 自定义信号带参数重载问题 3 函数重载问题总结 4 信号和槽的扩展 1 信号连接 connect 2 信号的断开 disconnect 3 信号和槽的参数 二 Lam
  • LetCode#1给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。JAVA

    题目 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺序返回答
  • Vue-cli快速创建vue项目

    使用vue cli需要的环境 nodejs 一 什么是vue cli 还记得最初使用webpack搭建项目的痛苦了吗 各种配置 去配置我们的各种loader 插件 项目运行脚本 非常难受 今天我们就学习vue cli 这个东西 再无webp
  • 直接替换Springboot jar包中的文件

    Linux Springboot 在不重新打包的情况下 修改配置文件 直接vim xxx jar包后 可以通过 关键字来查找文件 查找到以后 通过方向键进行控制 enter进入文件 i进入插入模式 修改文件 保存等操作和vim的操作一样 修
  • spdlog日志安装与使用

    spdlog是一个开源的且只需要头文件即可使用的跨平台日志库 适用于c 11版本 1 安装步骤 1 源码下载 git clone https github com gabime spdlog 2 拷贝头文件 cp rf spdlog inc
  • Java中的“static“关键字

    写在前面 前阵子看到一篇有关于Java中static的使用和介绍 讲的比较全面 近几日忽然想起早先工作碰到的有关static的相关问题 自己也总结一下吧 static是我们项目中经常用到的关键字 也是Java中非常重要的一个关键字 stat
  • 单片机多任务程序的框架

    下面说的单片机也主要是51与台系芯片 也就是现在的工作 其它应用不在讨论范围 才识有限 也敬请前辈们勘误 指教 一个真正意义的单片机系统肯定会是多任务的 怎样建立一个多任务程序的框架 1 前后台系统 前台是中断程序 后台是执行主程序 当中断
  • java 图书馆管理系统(超低配版)

    目录 图书管理系统要求 思路 show 方法 add 方法 search方法 delete 方法 代码 接口 Book类 Reader类 User类 Informatica类 BookList类 ReaderList类 UserList类
  • 借助py2neo将csv文件导入neo4j

    下载安装建议 戳我 启动neo4j 安装好之后以管理员权限启动 cmd 输入 neo4j bat console 启动 neo4j 在浏览器端可以打开 http localhost 7474 则说明启动成功 关于py2neo 先来了解些 p
  • this指针概念

    c 中成员变量和成员函数是分开存储的 每一个非静态成员函数只会诞生一份函数实例 也就是说多个同类型的对象会共用一块代码 那么问题是 这一块代码是如何区分哪个对象调用自己呢 c 通过特殊的对象指针 this指针 解决上述问题 this指针指向
  • 数组判断任意出现的重复值

    1 题目背景 给你一个整数数组nums 如果任一值在数组中出现至少两次 返回true 如果数组中每个元素互不相同 返回false 2 代码实现 public class Solution public static void main St

随机推荐

  • socat开放端口&&net命令&&sc命令

    socat socat是一个多功能的网络工具 名字来源于SOcket CAT 是netcat的增强版 扩展了设计 并有新的实现 工具下载地址 http www dest unreach org socat 演示如何开放端口 1 如下所示 开
  • Java动态执行代码字符串

    1 步骤 假如我们需要动态执行一段字符串形式的java代码 大概需要这样几步 生成文件 具体的文件 内存中的文件 调用javac编译 通过反射执行 2 生成文件 确定字符串的形式 字符串已经是完整的 java形式 那么就不再需要再做操作 写
  • 尼克劳斯·沃斯奖 (Niklaus Wirth Award) Pascal最具价值贡献者奖Marco Cantú获奖感言:关于Pascal和Delphi历史的个人观点

    这是一篇很长的博客文章 其中包含我在萨拉曼卡国际Pascal帕斯卡大会上发表的演讲 这是一部Pascal的历史 但是是从非常个人的角度来看的 在开始演讲之前 我要感谢国际Pascal大会的组织者 特别是塞尔吉奥 他们为举办这次活动付出了巨大
  • QT图片叠加CompositionMode效果一览

    QPixmap tmpPix pix size tmpPix fill Qt transparent QPainter p1 tmpPix p1 setCompositionMode QPainter CompositionMode Sou
  • C++操作Redis的简单例子

    相信做过服务端开发的应该都知道Redis的大名 它是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 我们后台是用C 开发的 问了下他们 用的缓存框架有Redis SSDB 今天看了几个帖
  • linux kill掉其他的登录用户

    为什么80 的码农都做不了架构师 gt gt gt 我们在LINUX下可以使用多个用户在不同地方连接上LINUX服务器 这样也出现一个问题就是会有多个用户登陆到服务器上了 在系统中我们可以使用命令who 或者w 来查看当前有多少个用户登陆了
  • 华为云云耀云服务器 L 实例评测|配置教程 + 用 Python 简单绘图

    文章目录 Part I Introduction Chap I 云耀云服务器 L 实例简介 Chap II 参与活动步骤 Part II 配置 Chap I 初步配置 Chap II 配置安全组 Part III 简单使用 Chap I V
  • 快速入门 Logback

    简介 Logback 旨在作为流行的 log4j 项目的继承者 它是由 log4j 创始人 Ceki Gulcu 设计的 同时它也是 SpingBoot 项目的默认日志框架 安装 因为 logback 需要和 slf4j 一起使用 所以总共
  • react antv g2 图表更新踩坑记录

    记录一下 antv g2 踩的坑 1 声明一个chart let charts useRef 2 通过调接口获取数据源 3 判断是否第一次获取数据源 if 是否第一次获取数据源 enterpriseColumn res data else
  • 踩坑,发现一个ShardingJdbc读写分离的BUG

    前言 最近公司准备接入ShardingJdbc做读写分离了 老大让我们理一理有没有写完数据立马读的场景 因为主从同步是有延迟的 如果写完读取数据走到从库 而从库正好有延迟 没读取到数据 岂不是造成了生产事故 今天我们来看看 Sharding
  • Shell中正则表达式

    1 正则表达式介绍 1 正则表达式 通常用于判断语句中 用来检查某一字符串是否满足某一格式 2 正则表达式是由普通字符与元字符组成 3 普通字符包括大小写字母 数字 标点符号及一些其他符号 4 元字符是指在正则表达式中具有特殊意义的专用字符
  • 参加电子大赛的经验总结,希望对在校大学生有所帮助

    参加电子大赛的经验总结 赵亮 大连理工大学 0 简介 我是大连理工大学03级的学生 参加了05年9月份举办的全国大学生电子设计大赛 最终我们队获得了辽宁省特等奖 全国二等奖的成绩 全国大学生电子设计大赛每两年举办一次 为全国各高校本科生电子
  • osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算

    目标 一零八 中的问题194 rex的瓦片分级为0 1 19 第0级角度分辨率 180 第1级角度分辨率 180 2 第19级角度分辨率 180 2 19 0 00034332275390625 每个瓦片默认像素为256 256 则每个像素
  • Hive常⽤交互命令与属性配置

    文章目录 Hive常 交互命令与变量属性 一 Hive常用交互命令 1 启动集群 2 查看帮助 3 使用参数 1 在Hive命令行里创建一个表student 并插入1条数据 2 打开hive命令 窗 时定义变量 3 打开verbose模式
  • 解决电脑能够登录QQ,但是不能打开网页的问题

    电脑更新Win11之后每次重新开机都会出现能够登录QQ 但是打开不了网页的问题 解决办法分为三种 方法一 让你的电脑管家帮你 最省事的办法 打开你的安全卫士之类的软件 这里我用的是联想自带的联想电脑管家 首先点右上角的小箱子图标 然后在新的
  • Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    http www cnblogs com likehua p 4023667 html
  • 概述计算机网络五层原理体系结构中各层的功能_请收好这一份详细清晰的计算机网络基础学习指南...

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 来源 简书 作者 Carson Ho 链接 jianshu com p 45d27f3e1196 前言 计算机网络基础是研发 运维工程师都需掌握的知识 但往往会被忽略 今天 我将献
  • 【无标题】苹果手机连接罗技鼠标和蓝牙键盘的设置方法

    苹果手机连接罗技鼠标和蓝牙键盘的设置方法如下 iPhone手机打开鼠标设置的路径 设置 辅助功能 触控 辅助触控 打开 请按以下步骤操作 第一步 第二步 第三步 第四步 到这一步以后 屏幕上会出现一个半透明小圆球 同时也可以蓝牙连接鼠标 连
  • 复习之web服务器--apache

    PS Vim复制小技巧 一 实验环境 两台虚拟机 nodea nodeb 配置ip 搭建软件仓库 关闭selinux root ftp Desktop hostnamectl set hostname nodea westos org ro
  • 多文件上传关于input type=file元素

    我们都知道 html5中有个input type file元素 用该元素可以实现页面上传文件的功能 但一般的做法只是简单的在表单中操作 我来研究一下深层东西 想要了解它 就要知道它的内置对象 files 页面上写一个input 然后选俩个图