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

相关文章

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

在React聊天应用中实现图片上传功能

《在React聊天应用中实现图片上传功能》在现代聊天应用中,除了文字和表情,图片分享也是一个重要的功能,本文将详细介绍如何在基于React的聊天应用中实现图片上传和预览功能,感兴趣的小伙伴跟着小编一起... 目录技术栈实现步骤1. 消息组件改造2. 图片预览组件3. 聊天输入组件改造功能特点使用说明注意事项

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例