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换行 不可缺少

代码实现

 1 var http = require(‘http‘)
 2 var fs = require(‘fs‘)
 3 var querystring = require(‘querystring‘)
 4 var path = require(‘path‘)
 5 var util = require(‘util‘)
 6
 7 var boundaryKey = Math.random().toString(16); // random string
 8 var reqdata = {
 9   ‘abc‘ : ‘123‘
10 }
11
12 var request = http.request({
13   host : ‘abc.com‘,
14   port : 80,
15   path : ‘/abc‘,
16   method : ‘POST‘
17 }, function (response) {
18   var data = ‘‘;
19   response.on(‘data‘, function(chunk) {
20     data += chunk.toString();
21   });
22   response.on(‘end‘, function() {
23     console.log(data);
24   });
25 });
26
27 var enddata = ‘\r\n--‘ + boundaryKey + ‘--‘;
28 function mkfield (field, value) {
29   return util.format(‘Content-Disposition: form-data; name="%s"\r\n\r\n%s‘, field, value);
30 }
31 var payload = ‘--‘ + boundaryKey + ‘\r\n‘
32 for (var name in reqdata){
33   payload += mkfield(name ,reqdata[name]) + util.format(‘\r\n--%s\r\n‘, boundaryKey)
34 }
35 payload += ‘Content-Disposition:form-data; name="img"; filename="image.jpg"\r\n‘
36   + ‘Content-Type:image/jpeg\r\n‘
37   + ‘Content-Transfer-Encoding: binary\r\n‘
38   + ‘\r\n‘;
39
40 request.setHeader(‘Content-Type‘, ‘multipart/form-data; boundary=‘+boundaryKey+‘‘);
41 //request.setHeader(‘Content-Length‘, Buffer.byteLength(payload)+Buffer.byteLength(enddata))
42
43 request.write(payload )
44
45 fs.createReadStream(‘文件路径‘, { bufferSize: 4 * 1024 })
46 .on(‘end‘, function() {
47 //报文结束
48   request.end(enddata);
49 }).pipe(request, { end: false })
时间: 2024-10-29 19:07:48

node 上传文件 http client to post file的相关文章

node 上传文件

file.js文件 需要安装formidable 模块 var formidable = require('formidable'); var     http = require('http'); var     sys = require('sys');   http.createServer(function(req, res) {        if (req.url == '/upload' && req.method.toLowerCase() == 'post') {    

node上传文件并在网页中展示

一.需求 1.当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件上传的表单. 2.用户可以选择一个图片并提交表单,随后文件将被上传到http://domain/upload, 3.访问http://domain/upload,展示刚才上传的图片. 二.分析模块需求 1.我们需要提供web页面,因此需要一个HTTP服务器 2.对于不同的请求,根据URL,我们服务器需要给予不同的响应,因为我们需要一个路由,用户把请求对应到请求处理程序. 3.当请求被服务器接收

上传文件块client实现

首先由内容阻止所有文件(块大小的约束),然后对于每一个chunk构造单独的一个UDP 数据报进行传输,在应用层的開始是自己定义的包头,有块号,块长度,块指纹等元数据信息,这些信息便于接收端可以按序正确接收. /*--vonzhou ---this project is to upload file after chunking using rabin fingerprint, here use UDP so that every packet nodelay. but we need to en

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 replicated to 0 nodes instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are excluded in this operation. 上网查了一下,先把,nnamenode和datanod

安卓上传文件至PHP服务器

前两个月有幸参加一次免费培训,开发了一款小软件.发现AsyncHttpClient还真是好用. 直奔主题,安卓上传文件至PHP服务器: 1.PHP端服务器: <?php //链接数据库 include ("config/db.php"); //获取用户id $userid = $_POST['userid']; //处理上传文件 $base_path = "upload/"; $fileName=$_FILES['file']['name']; $name=e

FastDfs 学习进阶之环境安装及上传文件测试

一:环境介绍       10.63.13.138 tracker,nginx proxy 10.63.13.143 storage,nginx 二:资源包准备 FastDFS官方论坛:http://www.csource.org 资源下载路径:http://sourceforge.net/projects/fastdfs/files/ 本实验学习环境使用CENTOS 6.4 X64 需要下载的资源包: FastDFS源代码:FastDFS_v5.05.tar.gz nginx模块源代码:fas

上传文件的表单

1.使用Apache 的 Commons FileUpload FileUpload下载地址: http://commons.apache.org/fileupload/ 下载:commons-fileupload-1.2.2-bin.zip    得到:commons-fileupload-1.2.2.jar http://commons.apache.org/io/ 下载:commons-io-1.4-bin.zip       得到:commons-io-1.4.jar 2.web.xml

PHP学习日记-上传文件

图片上传是很多网站的必备功能,如何将本地的图片上传到服务端呢?看看下面的 浏览器获取上传文件的路径 <input type="file" name="attachment" id="attachment" /> 只能获取文件名,但是不能获取文件的本地路径,其实在浏览器获取上传文件的本地路径是不安全的,现在很多浏览器都不支持此功能,其实这个功能只是为了在上传前显示一张缩略图罢了. 直接上传文件内容 client端的代码,这里取上传图片为

android-async-http上传文件

1. AsyncHttpClient, RequestParams ,AsyncHttpResponseHandler三个类使用方法 (1)AsyncHttpClientpublic class AsyncHttpClient extends java.lang.Object 该类通常用在android应用程序中创建异步GET, POST, PUT和DELETE HTTP请求,请求参数通过RequestParams实例创建,响应通过重写匿名内部类 ResponseHandlerInterface