POST数据的两种提交格式
  • application/x-www-form-urlencoded(上传数据中没有文件)
  • multipart/form-data (文件上传)
获取POST数据,post数据的传输是可能分包的,因此必然是异步的。post数据的接受过程如下:
var postData = '';
req.on('data',function(chunk){
postData += chunk;
})
req.on('end',function(){
console.log(postData);
})
*** 注意,对于非文件post数据,上面以字符串接收是没问题的,但其实 postDataChunk 是一个 buffer 类型数据,在遇到二进制时,这样的接受方式存在问题。***
 
下面是一个上传一个3K(2777)的小图片为例:
  1. 字符拼接的做法:
  2.  var postData = '',size = 0;
    req.on('data',function(chunk){
    postData += chunk;
    size = chunk.length;
    })
    req.on('end',function(){
    console.log('----------------postData begin-----------------')
    console.log(postData);
    console.log("以字符串拼接的长度:"+postData.length);
    var buf = new Buffer(postData);
    console.log('文件转换成buffer二进制的长度:'+buf.length);
    console.log('----------------postData end -----------------')
    console.log('POST文件的真实长度:'+size);
    })

运行js文件,对比数据长度这种获取POST数据通过字符串拼接存在问题,【图片POST传过来是二进制类型数据】(到最后写入图片文件出错),如果上传文件本身就是字符类型,这种方法可行。
 
 

2.buffer二进制拼接

     var chunks = [],size = 0;
req.on('data',function(chunk){
chunks.push(chunk);
size += chunk.length;
})
req.on('end',function(){
console.log('-------------- end -----------------');
console.log(chunks);
console.log('--------------POST的数据 begin-----------------');
console.log(chunks[0].toString());
console.log('--------------POST的数据 end -----------------');
console.log('以二进制拼接起来的数据长度:'+chunks[0].length);
console.log('以二进制POST过来的数据长度:'+size);
})

总结:

  1. 必须使用buffer来进行post数据的解析
  2. 利用文章一开始的方法(data += chunk, data为字符串 ),可以利用字符串的操作,轻易地解析出各自端的信息,但是这样有两个问题:
    • 文件的写入需要buffer类型的数据
    • 二进制buffer转化为string,并做字符串操作后,起索引和字符串是不一致的(若原始数据就是字符串,一致),因此是先将buffer数据的toString()复制给一个字符串,再利用字符串解析出个数据的start,end位置这样的方案也是不可取的。
  • 利用边界字符串来分割各字段数据 
  • 每个字段数据中,使用空行(\r\n\r\n)来分割字段信息和字段数据 
  • 所有的数据都是以\r\n分割 
  • 利用上面的方法,我们以某种方式确定了数据在buffer中的start和end,利用buffer.splice( start, end ) 便可以进行文件写入了.

nodejs的POST两种type类型提交(原生)的更多相关文章

  1. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  2. HTML表单之input元素的23种type类型

    摘自:http://www.cnblogs.com/xiaohuochai/p/5179909.html 了解HTML表单之input元素的23种type类型 随着HTML5的出现,input元素新增 ...

  3. java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)

    当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...

  4. 列举两种不同类型的Java标识注释,并解释它们之间的区别。

    列举两种不同类型的Java标识注释,并解释它们之间的区别.

  5. 两种常量类型-readonly和const

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...

  6. Java中的两种异常类型及其区别?

    Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...

  7. 了解HTML表单之input元素的23种type类型

    目录 传统类型 text password file radio checkbox hidden button image reset submit 新增类型 color tel email url ...

  8. MySQL的两种日志类型,redo log,binlog

    文章内容学习:极客时间-林晓彬老师-MySQL实战45讲 整理而得 我们知道MySQL数据库在发生意外宕机的情况下,可以将数据恢复到历史的某个时间点,能实现这个功能依靠的是日志,MySQL提供两种类型 ...

  9. Spring的IOC逐层深入——依赖注入的两种实现类型

    构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...

随机推荐

  1. 题解【洛谷P2279】[HNOI2003]消防局的设立

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有\(n\)个基地.起初为了节约材料,人类只修建了\(n-1\)条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  2. Springboot的多环境配置

    通常应用都会被安装到几个不同的环境(比如开发.测试.生产等),每个环境都会有一些参数是不一样的. Spring Boot对此也提供了支持,配置文件的名称只要满足application-{profile ...

  3. 查询数据操作:distinct

    1.作用:distinct 去除重复记录.重复记录,指的是字段值,都相同的记录,而不是部分字段值相同的记录 与之相对的是all,表示所有.在MySQL中默认就是all. 2.例子: select ch ...

  4. Django报错 The serializer field might be named incorrectly and not match any Got AttributeError when attempting to get a value for field `author_for` on serializer `KnownledgeBaseListSerializer`

    1.问题描述,在设置,model部分字段的serialier时,出现如下报错 字段如下: # 知识库List class KnownledgeBaseListSerializer(serializer ...

  5. javascipt——jQuery

    1.首先需要导入jQuery1.12.4.js文件,把文件和当前目录放同一目录下.在<body>中写上<script scr = 'jQuery1.12.4.js'><s ...

  6. 5.Python语句

    .button, #logout { color: #333; background-color: #fff; border-color: #ccc; } span#login_widget > ...

  7. selenium配合phantomjs实现爬虫功能,并把抓取的数据写入excel

    # -*- coding: UTF-8 -*- ''' Created on 2016年5月13日 @author: csxie ''' import datetime from Base impor ...

  8. ${var}与$var的区别,个人总结的看法

    ${var}  set variable 123 ${var}类似于变量值,相当于123 $var类似于变量名,指向对应的存储位置,相当于“123”,一般只有在rf关键字为断言的如“should be ...

  9. C语言程序设计(二)

    目录:   1.算法基本概念 2.认识循环语句 3.算法的表示法 4.求素数 5.求闰年 6.判断一个数是否为回文数 算法基本概念: (一)一个程序主要包含的2方面信息: 1.对数据的描述,在程序中要 ...

  10. 控制反转(IOC)和依赖注入(DI)

    控制反转(IOC)和依赖注入(DI)IoC(Inversion of Control,控制反转) 是Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想.它的主要目的是借助于 ...