FormData上传多个文件 可选择多个文件 也可选择完删除部分 再上传

2023-12-25 14:32

本文主要是介绍FormData上传多个文件 可选择多个文件 也可选择完删除部分 再上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章借鉴一位前辈的文章:http://www.cnblogs.com/imwtr/p/5924042.html

FormData上传多文件

  • FormData的基本用法
  • 遍历FormData的常用方法
  • FormData上传多文件存在的问题

FormData的基本用法

通常呢 我们创建Formdata对象有两种
官方文档是这么说的:
1.你可以自己创建一个FormData对象,然后调用它的append()方法来添加字段,像这样:

var formData = new FormData();formData.append("username", "Groucho");
formData.append("accountnum", 123456); //数字123456会被立即转换成字符串 "123456"

2.通过HTML表单元素创建FormData对象;

var formData = new FormData(someFormElement);
//someFormElement 为form表单元素  

这个传递给后台的键值对 键就是每个input的name值 值就是每个input的value值

我们会发现 FormData对象是打印不出来的 这个时候我们想看 这个对象里都存了什么数据 该怎么办呢 可以参考文档里的
方法 遍历打印出来

遍历FormData的常用方法

1.entries() 方法

FormData.entries() 方法返回一个 iterator对象 ,此对象可以遍历访问FormData中的键值对。其中键值对的key是一个 USVString 对象;value是一个 USVString , 或者 Blob对象。
示例:

// Create a test FormData object
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');// Display the key/value pairs
for(var pair of formData.entries()) {console.log(pair[0]+ ', '+ pair[1]); 
}

详情可以看官方的api,传送门:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/entries
2.keys();
3.values();
这些方法官方都有详细介绍 就不复制了

FormData上传多文件存在的问题

FormData上传多文件 ,我们应该都见过那种 上传多个文件 选择完了 之后 有可能点错了 或者不想继续上传了 可以删除 再选择。这个时候就会存在表面上我们可以把div移除 但是FormData仍然会把所有的都上传了 导致你删除的没有删掉。

查了查官网 有一个delete方法 删除指定 key 和它对应的 value(s)。 可是多文件的话 就不能用这个了 怎么办呢?

因为files是不允许被修改的
我们可以新建一个空数组 把files赋给这个空数据 对这个空数组进行 添加删除 然后 把这个数组append到formdata 然后 提交到后台
这里还需要注意一点 ,提交的时候 按钮需要type=”button” 否则有的情况会直接以submit形式提交了
这里我写了一个demo,代码如下:
点击已选择的框框 可以删除
html文件:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;}ul{list-style:none;}ul{width:700px;border:2px solid red;padding:10px;}.clearfix:after{display: block;content:'';overflow: hidden;visibility: hidden;clear: both;height:0;}.content ul li{float:left;width:100px;height:100px;margin:0 10px;border:1px solid #ccc;}.addFile{background:url("../img/icon12.png") no-repeat;background-position: center center;}#attach{width:100%;height:100%;opacity:0;}</style>
</head><body><form action="formData_test.php" id="form"><div class="content"><ul class="clearfix ul-box"><li class="addFile"><input type="file" id="attach"  multiple require /></li></ul></div><input type="text" name="name"/><input type="text" name="age"/><input type="text" name="sex"/><input type="button" value="上传" class="subBtn"/></form>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>//定义一个数组 把文件数组的值给新数组  对新数组进行操作  然后把新数组传递给后台var curFiles = [];$("#attach").change(function(){var fileArr = $(this)[0].files;Array.prototype.push.apply(curFiles, fileArr);
//      var fileArr = this.files;console.log(fileArr);//这里展示的话  还是用fileArrfor(var i=0;i<fileArr.length;i++){console.log(fileArr[i]);var item = fileArr[i];var abc=$("<li class='showf'><p style='overflow:hidden;text-overflow:ellipsis; '>文件名:"+item.name+"</p>"+"<p>大小:"+(item.size/1024).toFixed(2)+"KB</p></li>");$(".ul-box").prepend(abc);}
//      fileArr.map(function(item,index,arr){
//          var abc=$("<li><p>文件名:"+item.name+"</p>"+
//                  "<p>大小:"+parseInt(item.size/1024)+"KB</p></li>");
//          $(".ul-box").prepend(abc);
//      })})  
$(".ul-box").on("click",".showf",function(){var index = $(".showf").index($(this));alert(index);var name = $(this).find("p").eq(0).html();console.log(curFiles);
//  curFiles = curFiles.filter(function(file) {
//      return file.name != name;
//  });curFiles.splice(index,1)console.log(curFiles);$(this).remove();
})
$(".subBtn").click(function(){// 构建FormData对象var fd = new FormData($('#form')[0]);for (var i = 0, j = curFiles.length; i < j; ++i) {fd.append('attach[]', curFiles[i]);}for(var pair of fd.entries()) {console.log(pair[0]+ ', '+ pair[1]); }$.ajax({url: 'formData_test.php',type: 'post',data: fd,processData: false,contentType: false,success: function(rs) {console.log(rs);},error: function(err) {}});
})
</script></html>

formData_test.php php文件:

<?php
$files = $_FILES['attach'];
var_dump($files);?>

要把文件放到服务器环境下如appache 才能看到php打印的信息。

这篇关于FormData上传多个文件 可选择多个文件 也可选择完删除部分 再上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/535857

相关文章

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Python实现自动化删除Word文档超链接的实用技巧

《Python实现自动化删除Word文档超链接的实用技巧》在日常工作中,我们经常需要处理各种Word文档,本文将深入探讨如何利用Python,特别是借助一个功能强大的库,高效移除Word文档中的超链接... 目录为什么需要移除Word文档超链接准备工作:环境搭建与库安装核心实现:使用python移除超链接的

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即