第十三章认识Ajax(四)

news2025/1/19 7:55:16

认识FormData对象

FormData对象用于创建一个表示HTML表单数据的键值对集合。

它可以用于发送AJAX请求或通过XMLHttpRequest发送表单数据。

以下是FormData对象的一些作用

  1. 收集表单数据:通过将FormData对象与表单元素关联,可以方便地收集表单中的数据。使用FormData对象,可以获取表单中的键值对,包括输入框、选择框、单选框、复选框等元素的值。

  2. 发送表单数据:使用FormData对象,可以将表单数据通过AJAX请求或XMLHttpRequest发送到服务器。FormData对象提供了一些方法,可以设置请求头部、添加/删除键值对、追加数据等。

  3. 支持文件上传:FormData对象支持文件上传功能。可以通过使用FormData对象的append()方法,将文件对象添加到表单数据中,然后发送到服务器。这使得文件上传变得非常简单。

总之,FormData对象提供了一种简便的方式来处理和发送表单数据,包括键值对和文件上传。它是进行AJAX表单提交的一种常用方式。

FormData对象实例方法

在使用FormData对象之前,首先需要用new关键字通过实例化FormData()构造函数来创建FromData对象,代码如下:

var formData = new FormData(form);

这段代码的功能是将指定表单中的所有输入字段和值转化为 FormData 对象,并将这个对象存储在 formData 变量中以供进一步使用

代码解释

  1. var formData:创建一个名为 formData 的变量,用于存储 FormData 对象的实例。
  2. new FormData(form):通过 FormData 构造函数创建一个新的 FormData 对象,并将表单元素 form 作为参数传递给构造函数。这会将表单中的所有字段和值存储到 FormData 对象中。
  3. form:这是一个表单元素的引用,表示要收集数据的表单。这可以是一个通过 document.getElementById() 或其他方法获取的表单元素。
  4. =:将右侧的表达式的值(FormData 对象)赋给左侧的变量 formData

FormData实例对象提供了四种方法,具体如下:

set()方法用于设置FormData对象属性的值

set('key','value');

get()方法用于获取FormData对象属性的值

get('key');

append()方法用于添加FormData对象属性的值

append('key','value');

delete()方法用于删除FormData对象属性的值

delete('key');

FormData对象实例方法的使用

知道了实例化对象方法的使用,就用简单的案例来了解

第一:在D:code/chapter06/server目录下,新建public目录,在此目录下新建demo01.html文件,编写代码如下

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>实例化对象</title>
</head>

<body>
    <!--创建普通的form表单-->
    <form id="form" style="width: 245px;">
        用户名:<input type="text" name="username" style="float: right;" /><br><br>
        密码:<input type="password" name="password" style="float: right;" /><br><br>
        <input type="button" id="btn" value="提交" />
    </form>
    <script>
        //获取按钮
        var btn = document.getElementById('btn');
        //获取表单
        var form = document.getElementById('form')
        //为按钮添加单击事件
        btn.onclick = function () {
            //将普通的form对象表单转化为FormData对象
            var formData = new FormData(form);
            console.log(formData.get('username'));
            //如果设置的表单属性存在,将会覆盖属性原有值
            formData.set('username', '李四');
            console.log(formData.get('password'));
            formData.append('username', '王五');
            console.log(formData.get('username'));
            //如果设置表单属性不存在,将会创建表单属性
            formData.set('age', 100);
            console.log(formData.get('age'));
            //删除用户输入密码
            formData.delete('password');
            console.log(formData.get('password'));
            //创建空的表单对象
            var f = new FormData();
            f.append('sex', '男');
            console.log(f.get('sex'));
        };
    </script>
</body>

</html>

第二:在server目录下安装Express框架,并新建app.js文件,代码如下:

//引入express框架
const express = require('express');
//路径处理模块
const path = require('path');
//创建web服务器
const app = express();
//静态资源访问服务功能
app.use(express.static(path.join(__dirname, 'public')));
//监听端口
app.listen(3000);
//打印信息
console.log('服务器启动成功!');

第三:在浏览器中查看”localhost:3000/demo01.html“,输入用户名和密码,然后单击即可

formidable表单解析对象的基本使用

流程:

在发起Ajax请求时,FormData对象可以作为POST请求参数直接传递给服务器端,服务器端使用formidable表单解析对象parse()方法处理FormData对象,并将FormData对象数据的处理结果返回给客户端。

作用:

Formidable是一个用于解析表单数据的Node.js模块。它提供了一个易于使用的API,可以解析表单数据,并将其转换为JavaScript对象。

使用Formidable,可以轻松地处理文件上传、解析URL编码的表单数据,以及处理多部分表单数据

注意:

FormData对象需要被传递到send()方法中,而GET请求方式的请求参数只能放在请求地址中的”?“

连接符号的后面,所以FormData对象不能用于GET请求方式。

案例:

第一:在D:code/chapter04/server目录下,下载和安装formidable模块,执行命令如下

npm install formidable  --save
//formidable是要安装的模块,save表示运行时依赖

第二:在server目录下打开app.js文件,在文件头引入formidable模块和编写定义代码,代码如下

//引用formidable模块
const formidable = require('formidable');
const form = new formidable.IncomingForm();
const express = require('express');
//路径处理模块
const path = require('path');
//创建web服务器
const app = express();
//静态资源访问服务功能
app.use(express.static(path.join(__dirname, 'public')));
//定义路由
app.post('./formData', (req, res) => {
    //创建对象
    const form = new formidable.IncomingForm();
    //解析对象
    form.parse(req, (err, fields, files) => {      
            res.send(fields);  
    });
});
//监听端口
app.listen(3000, () => {
    console.log('服务器启动成功!');
});

第三:然后在demo02.html文件中修改<script>中的部分代码

(注意:这个简单的案例跟上面案例的代码一样,只不过修改一部分)

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>实例化对象</title>
</head>

<body>
    <!--创建普通的form表单-->
    <form id="form" style="width: 245px;">
        用户名:<input type="text" name="username" style="float: right;" /><br><br>
        密码:<input type="password" name="password" style="float: right;" /><br><br>
        <input type="button" id="btn" value="提交" />
    </form>
    <script>
        //获取按钮
        var btn = document.getElementById('btn');
        //获取表单
        var form = document.getElementById('form')
        //为按钮添加单击事件
        btn.onclick = function () {
            //将普通的form对象表单转化为FormData对象
            var formData = new FormData(form);
            console.log(formData.get('username'));
            //创建xhr对象
            var xhr = new XMLHttpRequest();
            //对xhr对象进行配置
            xhr.open('post','http:localhost:3000/formData');
            //发送Ajax请求
            xhr.send(formData);
            //监听xhr对象下面的onload事件
            xhr.onload = function () {
                if (xhr.status == 200) {
                    console.log(xhr.responseText);
                };
            };
        };
    </script>
</body>

</html>

第四:在浏览器中输入访问本地地址即可

上传二进制文件的基本使用

二进制文件主要包括图片、视频和音频等文件,使用formidable表单解析对象来实现二进制文件上传的功能。

form表单解析对象是通过new实例化formidable.IncomingForm()构造函数创建了,该对象包含keepExtensions属性和uploadDir属性。

提示:IncomingForm对象有一些常用的属性和方法,其中包括:

  1. keepExtensions一个布尔值,用于指定是否保留上传文件的扩展名。默认值为false,即不保留扩展名。
  2. uploadDir一个字符串,表示上传文件的存储目录。默认情况下,文件将保存在操作系统的临时目录中。
  3. parse(request, callback)一个方法,用于解析表单请求。request参数是一个http.IncomingMessage对象,包含了客户端提交的表单数据。callback是一个回调函数,用于处理解析后的表单字段和文件。
  4. on(eventName, callback)一个方法,用于注册事件处理程序。常用的事件有fileBegin(在开始处理一个文件上传时触发)、progress(在文件上传过程中触发)、end(在所有文件上传完成后触发)等。
  5. 其他一些属性和方法,如setMaxFieldsSize(设置表单字段的最大大小)、setMaxFileSize(设置上传文件的最大大小)等。

keepExtensions属性  用于确定在上传过程中是否保留上传文件的文件扩展名。如果keepExtensions设置为true,则上传的文件将保留其原始的扩展名。如果设置为false,则文件扩展名将被删除。示例代码如下:

form.keepExtensions = true;

uploadDir属性  用于指定上传文件存储的目录。该属性用于确定保存上传文件的目标文件夹。示例代码如下:

 form.uploadDir = '/my/dir';

简单案例:

在D:code/chapter04/server/public目录下,新建demo03.html文件,编写代码如下

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>wenjain</title>
</head>

<body>
    <label>请选择文件</label>
    <input type="file" id="file" />
    <div id="box"></div>
    <script>
        //获取文件选择控件
        var file = document.getElementById('file');
        //获取图片容器
        var box = document.getElementById('box');
        //为文件选择控件添加onchange事件,选择文件时触发
        file.onchange = function () {
            //创建空的表单对象
            var formData = new FormData();
            //将用户选择的文件追加到formData表单对象中
            formData.append('attrName', this.files[0]);
            //创建xhr对象
            var xhr = new XMLHttpRequest();
            //配置对象
            xhr.open('post', 'http://localhost:3000/upload');
            //发送Ajax请求
           
            //监听服务器端响应给客户端的数据
            xhr.onload = function () {
                //展示图片
                //判断状态码
                if (xhr.status == 200) {
                    //转换为JSON对象
                    var result = JSON.parse(xhr.responseText);
                    //动态创建img元素对象
                    var img = document.createElement('img');
                    //为图片标签设置src属性
                    img.src = result.path;
                    //当图片加载完后
                    img.onload = function () {
                        //将图片显示在页面
                        box.appendChild(img);
                    };
                };
            };
        };
    </script>
</body>

</html>

在server目录下新建upload.js文件,编写代码如下:

//引入express框架
const express = require('express');
const formidable = require('formidable');
const path = require('path')
//创建服务器
const app = express();
//静态资源服务访问
app.use(express.static(path.join(__dirname, 'public')));
app.post('./uploads', (req, res) => {
    const form = new formidable.IncomingForm();
    //设置客户端上转文件路径
    form.uploadDir = path.join(__dirname, 'public', 'uploads');
    //保留上传文件扩展名
    form.keepExtensions = true;
    //解析客户端传递过来formData对象
    form.parse(req, (err, fields, files) => {
        //将客户端传传递过来的文件地址响应到客户端
        res.send({
            path: files.atteName.path.split('public')[1]
        });
    });
});
app.listen(3000);
console.log('服务器启动成功!');

输出结果

(我发现图片没有存储在uploads文件下,uploads文件需要手动创建,并且图片无法显示在浏览器中,各位网友能帮忙一下哦)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GitHub项目推荐--建一个 ChatGPT 机器人】【转载】

建一个 ChatGPT 机器人 bot-on-anything 它可以将 ChatGPT 等算法模型应用于各类平台。目前&#xff0c;它已经可以接入到个人微信、公众号、QQ、Telegram、Gmail邮箱、Slack 等待&#xff0c;并计划接入Web、企业微信、钉钉等。 通过使用该开源项目&#xff0c;开发者可以通…

一天吃透面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

机器学习之numpy库

机器学习之numpy库 numpy库概述numpy库历史numpy的核心numpy基础ndarray数组内存中的ndarray对象ndarray数组对象的特点ndarray数组对象的创建ndarray对象属性的基本操作数组的维度元素的类型数组元素的个数数组元素索引(下标) ndarray对象数组的自定义类型切片操作一维数组切片…

【LTSpice】导入第三方元件库 之 subckt文件类型

LTSpice想要导入第三方的元件库&#xff0c;网上教程非常多。这里记录一下一种不用include命令实现、以后可以直接在component里面添加的 subckt文件的导入。过程比较复杂。 本文只讲解subckt文件&#xff01;如果发现文件里有.SUBCKT这样的文字&#xff0c;说明可以用本文的方…

[UI5 常用控件] 03.Icon, Avatar,Image

文章目录 前言1. Icon2. Avatar2.1 displayShape2.2 initials2.3 backgroundColor2.4 Size2.5 fallbackIcon2.6 badgeIcon2.7 badgeValueState2.8 active 3. Image 前言 本章节记录常用控件Title,Link,Label。 其路径分别是&#xff1a; sap.m.Iconsap.m.Avatarsap.m.Image 1…

贪吃蛇项目(基于C语言和数据结构中的链表)

建立文件 首先先建立3个文件。 Snake.h 函数的声明 Snake.c 函数的定义 Test.c 贪吃蛇的测试 分析项目 我们分析这整个项目 建立节点 首先在我们实现游戏开始的部分之前&#xff0c;我们要先创建贪吃蛇的节点&#xff0c;再由此创建整个贪吃蛇所包含的一些信息&#…

【王道数据结构】【chapter2线性表】【P44t17~t20】【统考真题】

目录 2009年统考 2012年统考 2015年统考 2019年统考 2009年统考 #include <iostream>typedef struct node{int data;node* next; }node,*list;list Init() {list head(list) malloc(sizeof (node));head->next nullptr;head->data-1;return head; }list Buyne…

机器学习 | 如何使用 Seaborn 提升数据分析效率

Seaborn和Matplotlib都是Python可视化库&#xff0c;它们都可以用于创建各种类型的图表。但是&#xff0c;Seaborn 和Matplotlib在概念和设计上有一些不同。 Matplotlib虽然已经是比较优秀的绘图库了&#xff0c;但是它有个今人头疼的问题&#xff0c;那就是API使用过于复杂&am…

人工智能系列:机器的进化(下)

大家好&#xff0c;接着上文的图灵机&#xff0c;继续介绍机器的进化。 1. 第一台计算机 世界上第一台电子计算机是ENIAC&#xff08;埃尼阿克&#xff09;&#xff0c;这是课本上所写的。但计算机学界对于究竟哪台是第一台电子计算机其实存在着争议&#xff0c;除了 ENIAC 以…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现SPI控制OLED屏幕

上一篇&#xff1a; [嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

【Vue2 + ElementUI】更改el-select的自带的下拉图标为倒三角,并设置相关文字颜色和大小

效果图 实现 <template><div class"search_resources"><div class"search-content"><el-select class"search-select" v-model"query.channel" placeholder"请选择" change"handleResource&q…

【贪吃蛇:C语言实现】

文章目录 前言1.了解Win32API相关知识1.1什么是Win32API1.2设置控制台的大小、名称1.3控制台上的光标1.4 GetStdHandle&#xff08;获得控制台信息&#xff09;1.5 SetConsoleCursorPosition&#xff08;设置光标位置&#xff09;1.6 GetConsoleCursorInfo&#xff08;获得光标…

TikTok直播对网络环境的要求是怎么样的

TikTok直播作为一种互动性强、实时性要求高的社交媒体形式&#xff0c;对网络环境有着一系列特定的需求。了解并满足这些需求&#xff0c;对于确保用户体验、提高直播质量至关重要。本文将深入探讨TikTok直播对网络环境的要求以及如何优化网络设置以满足这些要求。 TikTok直播的…

Django学习之小试牛刀

六、Django学习之小试牛刀 其他关于Python Web开发笔记&#xff1a;&#xff08;如果遇到问题可以一起交流~&#xff09; 一、Flask学习之HTML-CSDN博客 二、Flask学习之CSS-CSDN博客 【接上篇】二、Flask学习之CSS&#xff08;下篇&#xff09;-CSDN博客 三、Flask学习之B…

读取一个batch的图像并且显示出来

1读取一个batch用于训练 我们在训练模型的时候&#xff0c;除了观察图像的标签和尺寸&#xff0c;最好能读取一个batch的图像显示出来&#xff0c;观察原始图像和grountruth是否对应&#xff0c;如果正确才能正式开始后续的训练。 下面以一个皮肤病分割的数据集加以演示。 2…

漏洞原理SQL注入 手工注入漏洞

漏洞原理SQL注入 手工注入漏洞 SQL 注入的前置知识 information_schema库information_schema 是mysql5.0以上版本中自带的一个数据库。tables表information_schema库中的tables表中table_schema列&#xff08;存储数据库名&#xff09;和table_name列&#xff08;存储表名&…

【第六天】蓝桥杯备战

题 1、明明的随机数2、特殊日期 1、明明的随机数 https://www.lanqiao.cn/problems/539/learning/ 解法&#xff1a;暴力 import java.util.Scanner; import java.util.Arrays; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main…

node学习过程中的终端命令

冷的哥们手真tm冷&#xff0c;打字都是僵的&#xff0c;屮 目录 一、在学习nodejs过程中用到的终端命令总结 一、在学习nodejs过程中用到的终端命令 node -v nvm install 20.11.0 nvm list nvm list available nvm on nvm -v nvm use 20.11.0 node加要运行的js文件路径 ps&a…

手指伸不直,锤状指不可忽视!

在日常生活和工作中&#xff0c;手指很容易戳伤&#xff0c;损伤后有时出现末节手指伸不直&#xff0c;影响手指屈伸活动障碍而就诊&#xff0c;医生会说手指损伤形成锤状指。那么什么是锤状指&#xff1f; 01 什么是“锤状指畸形”&#xff1f; 锤状指是指伸肌腱止点断裂后的…

确知信号的类型:能量信号与功率信号

通信原理第17页第一段&#xff1a; 例如&#xff0c; s ( t ) 8 s i n ( 5 t 1 ) , − ∞ < t < ∞ s(t)8sin(5t1),-\infty<t<\infty s(t)8sin(5t1),−∞<t<∞&#xff0c;就属于周期信号&#xff0c;其周期 T 0 2 π / 5 T_02\pi/5 T0​2π/5 三角函数很…