node 上传文件 http client to post file
node做http client 发送post数据是很容易的事情,但要上传文件就不是太容易了
主要是因为上传文件的报文和普通post是不太一样的
要了解http post可以看下这个 https://imququ.com/post/four-ways-to-post-data-in-http.html
npm上封装好的第三方库很多 比如request,我们来看下自己实现需要怎么做
首先要声称个随机串,这个是用来做分段的标记
var boundaryKey = Math.random().toString(16)
上传文件时要设置请求头 Content-Type : 'multipart/form-data; boundary='+boundaryKey+''
报文格式是这样的:
假如 boundaryKey=AaB03x
Content-Type: multipart/form-data; boundary=AaB03x --AaB03x
Content-Disposition: form-data; name="submit-name" Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain ... contents of file1.txt ...
--AaB03x--
from https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
每个字段用 “--”+分割符号 分段
结尾用 “--”+分割符号+“--” 注意用\r\n换行 不可缺少
代码实现
var http = require('http')
var fs = require('fs')
var querystring = require('querystring')
var path = require('path')
var util = require('util') var boundaryKey = Math.random().toString(); // random string
var reqdata = {
'abc' : ''
} var request = http.request({
host : 'abc.com',
port : ,
path : '/abc',
method : 'POST'
}, function (response) {
var data = '';
response.on('data', function(chunk) {
data += chunk.toString();
});
response.on('end', function() {
console.log(data);
});
}); var enddata = '\r\n--' + boundaryKey + '--';
function mkfield (field, value) {
return util.format('Content-Disposition: form-data; name="%s"\r\n\r\n%s', field, value);
}
var payload = '--' + boundaryKey + '\r\n'
for (var name in reqdata){
payload += mkfield(name ,reqdata[name]) + util.format('\r\n--%s\r\n', boundaryKey)
}
payload += 'Content-Disposition:form-data; name="img"; filename="image.jpg"\r\n'
+ 'Content-Type:image/jpeg\r\n'
+ 'Content-Transfer-Encoding: binary\r\n'
+ '\r\n'; request.setHeader('Content-Type', 'multipart/form-data; boundary='+boundaryKey+'');
//request.setHeader('Content-Length', Buffer.byteLength(payload)+Buffer.byteLength(enddata)) request.write(payload ) fs.createReadStream('文件路径', { bufferSize: * })
.on('end', function() {
//报文结束
request.end(enddata);
}).pipe(request, { end: false })
node 上传文件 http client to post file的更多相关文章
- node 上传文件 路径 重命名等问题
最近在学习node,想做一个简单的网站.首先想到的是上传文件的功能,查了下,发现有一个formidable模块,操作方便,便拿来尝试了一下,结果很纠结. 下载安装的就不用说了,用npm即可.说一下,自 ...
- node上传文件并在网页中展示
一.需求 1.当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 2.用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/ ...
- node - 上传文件并且修改名称
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 上传文件块client实现
首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确 ...
- 微信公众号平台上传文件返回错误代码:40005 invalid file type
错误原因:文件类型(后缀名)不符合要求. 具体到笔者的情况是:在将 MultipartFile 类型转换为File 类型时,方法 File.createTempFile("filename& ...
- hadoopmaster主机上传文件出错: put: File /a.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
刚开始装好hadoop的时候,namenode机上传文件没有错误,今天打开时突然不能上传文件,报错 put: File /a.txt._COPYING_ could only be replicate ...
- Flex和Servlet结合上传文件
Flex和Servlet结合上传文件 1.准备工作 (1)下载文件上传的组件,commons-fileupload-1.3.1.jar (2)下载文件输入输出jar,commons-io-2.4.ja ...
- OSS上传文件到阿里云
最近做项目,需要上传文件,因为上传到项目路径下,感觉有时候也挺不方便的,就试了一下上传文件到阿里云oss上去了, oss的使用网上有很多介绍,都是去配置一下需要的数据,然后直接调用他的api就可以了. ...
- JAVA上传文件到FTP上
添加maven <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> ...
随机推荐
- linux编译安装gdb7.10.1
1.下载GDB7.10.1安装包 #wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz 2.解压 #.tar.gz 3.创建安装目录 #/ #cd /u ...
- element-ui 分页中的slot的用法(自定义分页显示内容)
官方给的简单的例子以及效果. 最后弄成的效果: 按照文档在layout 添加slot, 这几个参数可以随意调换位置,然后分页显示效果会根据调换的位置显示相应内容.
- sublime3 install python3
链接地址:https://blog.csdn.net/Ti__iT/article/details/78830040
- 推荐使用sublime text 3 以及常用快捷键
vim这种上古神器,需要学习.记忆.折腾.比如我的初衷是要开发php的,连php都没专研透,哪有精力去折腾vim这玩意. 当然,vim绝技练成以后,配置成各种IDE都不是问题,还有你手速会飞起来. 但 ...
- JavaScript实现复选框的全选、不选、反选
方法一: <html> <head> <meta charset="utf-8"> <title>无标题文档</title&g ...
- LightOJ 1422 Halloween Costumes 【 区间dp 】
区间dp的第一题----- 看题解看了好多~~终于看懂了---55555 dp[i][j] 表示第i天到第j天至少需要多少件衣服 那么第i件衣服只被第i天占用的话, dp[i][j] = dp[i+1 ...
- Ad_hoc_polymorphism 备份
https://en.wikipedia.org/wiki/Polymorphism_(computer_science) https://en.wikipedia.org/wiki/Ad_hoc_p ...
- Java中类的定义
成员变量:对应事物的属性 成员方法:对应事物的行为 类定义的格式 定义类:就是定义类的成员,包括成员变量和成员方法 成员变量:和以前定义变量几乎是一样的.只不过位置发生了改变.在类中,方法外. 成员方 ...
- spring cloud(一) eureka
spring cloud 注册中心 eureka 搭建过程 1.搭建eureka-server 服务端 1.1. 新建boot工程 pom引入依赖 <dependency> <gro ...
- vue 绑定 HTML Class
绑定 HTML Class