前端提交数据到node的N种方式
写在前面
本篇介绍了前端提交数据给node的几种处理方式,从最基本的get和post请求,到图片上传,再到分块上传,由浅入深。
GET请求
经典的get提交数据,参数通过URL传递给node,node通过url包和querystring将参数解析出来,这个很简单,看代码就可以了。
前端:
GET:
<form action="http://localhost:8899/uploadGet" method="get">
<input type="text" placeholder="please enter name" name="name">
<input type="text" placeholder="please enter age" name="age">
<button>提交</button>
</form>
node:
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const fs = require('fs'); //这些引用后面代码就不重复写了 const app = http.createServer((req, res) => { let parsed_url = url.parse(req.url); if (parsed_url.pathname === '/uploadGet') { //匹配路由 let query = parsed_url.query; //获取url的query:id=xx&name=xx
let queryObj = querystring.parse(query); //将query字符串转换成对象:{id:xx, name:xx} res.writeHead(201, { 'content-type': 'text/html' })
res.end(`<h2>${JSON.stringify(queryObj)}</h2>`);
} }) app.listen(8899, () => { console.log('listen on 8899') })
POST请求
POST请求不是通过地址传参,而是将参数添加到请求体中发起请求。所以此时node不能通过地址获取参数,需要在req的on函数中获取数据。
前端:
<form action="http://localhost:8899/uploadPost" method="post" name="lzxform">
<input type="text" placeholder="please enter name" name="name">
<input type="text" placeholder="please enter age" name="age"> <br><br />
<input type="file" name="lzxfile" id="upload">
<button>提交</button>
<!-- <button onclick="submits(event)">提交</button> -->
</form>
node:
if (parsed_url.pathname === '/uploadPost') {
// 定义了一个post变量,用于暂存请求体的信息
var postData = '';
req.on('data', chunk => { //在on函数中获取请求体
postData += chunk; //请求数据过大时会自动进行多次请求 })
req.on('end', () => { //请求结束
res.writeHead(201, { 'content-type': 'text/plain' });
res.end(postData);
})
}
enctype
form标签有一个属性叫enctype,作用是规定在发送表单数据之前如何对其进行编码,默认值是 application/x-www-form-urlencoded,上述代码没有指定该值,所以在请求体中,数据还是以键值对的方式发送:
但是这种键值对的模式不适合发送图片这种二进制数据到后端,所以enctype还有个属性是multipart/form-data,数据以如下形式进行发送:
node如何处理图片数据
服务端拿到字符串或者数字可以直接保存到数据库里去,但是拿到图片或者文件这种二进制数据时就要特殊处理下了,需要先拿到上图中蓝框里的文件数据,再将数据保存到新的文件中。原生的node处理不是很方便,所以这里用了express来处理。
const express = require('express');
const multer = require('multer');
const upload = multer({ dest: './uploadedFiles' }); //设置图片的保存路径
const path = require('path');
const fs = require('fs'); var app = express() app.post('/uploadPost', upload.single('lzxfile'), function (req, res, next) { //lzxfile为上传input的name if (req.file) {
var ext = path.parse(req.file.originalname).ext; //获取上传的文件名后缀 fs.rename(req.file.path, req.file.path + ext, (err, data) => { //因为express另存为的文件默认没有后缀,所以需要加下
if (err) {
console.log(err);
} else {
console.log('rename done');
}
})
}
res.send(req.body)
}) app.listen(8899)
这样前端上传的文件就会被保存到设置的 uploadedFiles 目录下了。
前端提交blob数据给node
上文中我们用form来提交文件数据给node,form的缺点是上传后的回调函数不是很方便,需要借助formData这个api才能实现,而且传文件只能一次性直接上传,不能对文件进行分割等处理。所以这时就需要前端获取文件的blob数据再发送给后端
先来介绍下blob:
简而言之就是我们可以通过blob来处理图片或文本等二进制数据。关于blob的详细介绍可以看:https://www.cnblogs.com/hhhyaaon/p/5928152.html
现在我们希望在ajax中获取图片数据,再发送给后端。
前端提交数据到node的N种方式的更多相关文章
- Android提交数据到服务器的两种方式四种方法
本帖最后由 yanghe123 于 2012-6-7 09:58 编辑 Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方 ...
- 前台提交数据到node服务器(post方式)
post方式同样有两种办法,一种是表单提交,一种是ajax提交. 在此之前需要安装一个中间件:body-parser,安装好后在app.js头部引入: bodyParser = require('bo ...
- 前台提交数据到node服务器(get方式)
.有两种办法,一种是表单提交,一种是ajax方式提交. 1.form提交 在前台模板文件上写: <form action="/reg" method="get&q ...
- 前端传递数据到后台的两种方式;创建一个map或者创建一个FormData对象
一.构建一个map getAllDeptAllUsers(){ const modleCode = {'auditMenuId': this.auditMenuId, 'enterpriseId': ...
- 第1节 IMPALA:10、基本查询语法;11、数据加载的4种方式
9.3. 创建数据库表 创建student表 CREATE TABLE IF NOT EXISTS mydb1.student (name STRING, age INT, contact INT ) ...
- 小范笔记:ASP.NET Core API 基础知识与Axios前端提交数据
跟同事合作前后端分离项目,自己对 WebApi 的很多知识不够全,虽说不必要学全栈,可是也要了解基础知识,才能合理设计接口.API,方便与前端交接. 晚上回到宿舍后,对 WebApi 的知识查漏补缺, ...
- C#中POST数据和接收的几种方式(抛砖引玉)
POST方式提交数据,一种众所周知的方式: html页面中使用form表单提交,接收方式,使用Request.Form[""]或Request.QueryString[" ...
- [转]C#中POST数据和接收的几种方式
POST方式提交数据,一种众所周知的方式: html页面中使用form表单提交,接收方式,使用Request.Form[""]或Request.QueryString[" ...
- jquery ajax提交表单数据的两种方式
http://www.kwstu.com/ArticleView/kwstu_201331316441313 貌似AJAX越来越火了,作为一个WEB程序开发者要是不会这个感觉就要落伍,甚至有可能在求职 ...
随机推荐
- Thrift框架-具体使用
1.前言 使用thrift心得: (1)thrift是一个RPC的框架 ,RPC是远程过程调用协议:用于进行可扩展且跨语言的服务的开发,以构建在C++.Java.Python.PHP.Ruby.Er ...
- 07.python函数作用域global、nonlocal、LEGB
函数作用域 作用域 一个标识符的课件范围,这就是标识符的作用域,一般常说的是变量的作用域 def foo(): x = 100 print(x) # 可以访问到吗 上例中x不可以访问到,会抛出异 ...
- 《剑指offer》面试题17. 打印从1到最大的n位数
问题描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5 ...
- RichTextBox单独设置文字颜色
richTextBox1.Select(index, "str1".Length); richTextBox1.SelectionColor = Color.Red;
- UML 有关类图知识及类间关系
原文链接:https://blog.csdn.net/mj_ww/article/details/53020346 1. 类的含义 类图(Class diagram)显示了系统的静态结构,而系统的静态 ...
- 微信小程序-国际化(miniprogram-i18n)
前情提要 最近维护了一个微信小程序的老项目,维护的其中一项是添加国际化.由于踩了蛮多坑,所以就有了这篇文档!!! miniprogram-i18n 对除小程序外的其他框架开发做过国际化的朋友来说i18 ...
- Spring boot + Vue axios 文件下载
后端代码: @GetMapping("/{sn}") @ApiOperation(value = "获取文件",notes = "获取文件" ...
- golang中数组指针和指针数组当做函数参数如何修改数组中的值
先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...
- CSS基本语法(三)
目录 CSS基础语法(三) 十五.CSS定位 1.为什么要使用定位 2.定位组成 定位模式 静态定位 相对定位 绝对定位** 固定定位 粘性定位 边偏移 子绝父相 3.定位的叠放次序 4.拓展 绝对定 ...
- 多线程(Thread类中的方法线程名称)
1 package multithread; 2 3 /* 4 * 如何创建一个线程呢? 5 * 6 * 创建线程方式一:继承Thread类. 7 * 8 * 步骤: 9 * 1,定义一个类继承Thr ...