请问如何用nodejs通过post发送multipart/form-data类型的http请求?

2023-11-03

请问如何用nodejs通过post发送multipart/form-data类型的http请求?
 发布于 4 年前  作者  xuhaijinsky2008  24777 次浏览

请问如果用nodejs通过post发送multipart/form-data类型的http请求?

网络上搜索的都是解析multipart/form-data表单的,express已经提供了较好的支持,那NODEJS如果后台模拟发送multipart/form-data类型消息呢?上传个图片给接口方。

比如如何在后台用https.request模拟类似请求?纠结几天了,请大侠帮帮忙哦。

<form name='sendMsgToWxByPost' action='https://api.com/media?access_token=AAA' method="post" enctype="multipart/form-data" >
<input type="file" name="media" /> </form>

我知道application/x-www-form-urlencoded类型的请求是这样模拟的。

var post_data = querystring.stringify({
    type : "text",
    content: content
    
});

//1、创建消息
var options = {
 host: 'api.com',
 port: 443,
 path: '/messages?access_token='+accessToken,
 method: 'POST',
 headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     'Content-Length': post_data.length
 }
};

var reqHttps = https.request(options, function(resHttps) {
		console.log("statusCode: ", resHttps.statusCode);
		console.log("headers: ", resHttps.headers);
	 
	 	resHttps.setEncoding('utf8');
	 	resHttps.on('data', function(body1) {
	    console.log("body:"+body1);
	    }
// write data to request body
reqHttps.write(post_data);
reqHttps.end();
reqHttps.on('error', function(e) {
 console.error("error:"+e);
 return "系统异常:"+e.message;
});
10 回复

post_data 照着这里的格式发就行了:http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

我本来想在往微博发图片的功能里用的,不过做到一半改用了另一个通过地址上传图片的接口。

发个半成品的代码给你参考下:

var https = require('https');
var fs = require('fs');
var util = require('util');
var path = require('path');

var BOUNDARYPREFIX = 'nbglme';

var mkpic = function (pic, fn) {
  var mimes = {
    '.png': 'image/png',
    '.gif': 'image/gif',
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg'
  };
  var ext = path.extname(pic);
  var mime = mimes[ext];
  if (!mime) return;

  fs.readFile('/home/bnlt/'+pic, function (err, data) {
    content = util.format('Content-Disposition: form-data; name="pic"; filename="%s"\r\n', pic);
    content += util.format('Content-Type: %s\r\n\r\n', mime);
    content += data;
    fn(content);
  });
}

var mkfield = function (field, value) {
  return util.format('Content-Disposition: form-data; name="%s"\r\n\r\n%s', field, value);
}

exports.post = function (param, onsuccess, onfailer) {
  if (param.pic) {
    mkpic(param.pic, function (pic) {
      var data = [pic];
      delete param.pic;
      for (var i in param) {
        data.push(mkfield(i, param[i]));
      }

      var max = 9007199254740992;
      var dec = Math.random() * max;
      var hex = dec.toString(36);
      var boundary = BOUNDARYPREFIX + hex;

      var body = util.format('Content-Type: multipart/form-data; boundary=%s\r\n\r\n', boundary)
                 + util.format('--%s\r\n', boundary)
                 + data.join(util.format('\r\n--%s\r\n', boundary))
                 + util.format('\r\n--%s', boundary);

      console.log(body);
    });
  }
}

最后面 console.log(body) 中 body 里的数据就是要发送的数据

试试 needle 模块,简单好用。

看了一下,确实能够方便的满足此类需求,相见恨晚啊

嗯。昨天我也按照这样思路写的,模拟发post。发现Content-Length的计算结果和直接在IE浏览器提交抓包得到的数据差四个字符,很是诧异,不过总算可以上传给接口方了。是参考的这三篇文章,分享下啊:enter link description hereenter link description hereenter link description here

@xuhaijinsky2008关于Content-Length的问题可以看看我的一个帖子

@saighost 学习了,但是我的是个图片,没中文,呵呵,不过防止以后有中文,还是用那种方式吧,呵呵。

自己写的方法可以跑了,贴出来。

//发送单条消息给接口方app.post("/sendMsgToAByPost",function(req, res, next) {

//我的帖子:http://cnodejs.org/topic/4ffed8544764b729026b1da3
//http://yefeng.iteye.com/blog/315847
//http://stackoverflow.com/questions/5744990/how-to-upload-a-file-from-node-js
//http://stackoverflow.com/questions/9943010/node-js-post-file-to-server


console.log(req.files);
console.log(req.files.media.size);
var boundaryKey = Math.random().toString(16); //随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置
console.log(boundaryKey);
    
    var options = {
    		host: 'api.com',
    		port: 443,
    		path: '/media?type=image&access_token='+accessToken,
    		method: 'POST'
    };
    
    var reqHttps = https.request(options, function(resHttps) {
    	console.log("statusCode: ", resHttps.statusCode);
    	console.log("headers: ", resHttps.headers);
    	
    	resHttps.on('data', function(body1) {
		console.log("body:"+body1);
		});
    });
    var payload = '--' + boundaryKey + '\r\n'
    // use your file's mime type here, if known
    + 'Content-Type: image/jpeg\r\n' 
    // "name" is the name of the form field
    // "filename" is the name of the original file
    + 'Content-Disposition: form-data; name="media"; filename="aaa.jpg"\r\n'
    + 'Content-Transfer-Encoding: binary\r\n\r\n';
    console.log(payload.length);
    var enddata  = '\r\n--' + boundaryKey + '--';
    console.log('enddata:'+enddata.length);
    reqHttps.setHeader('Content-Type', 'multipart/form-data; boundary='+boundaryKey+'');
    reqHttps.setHeader('Content-Length', Buffer.byteLength(payload)+Buffer.byteLength(enddata)+req.files.media.size);
    
    reqHttps.write(payload);
    
    var fileStream = fs.createReadStream("D:\\aaa.jpg", { bufferSize: 4 * 1024 });
    fileStream.pipe(reqHttps, {end: false});
    fileStream.on('end', function() {
    	// mark the end of the one and only part
    	reqHttps.end(enddata); 
    	
    });
    
    reqHttps.on('error', function(e) {
    	console.error("error:"+e);
    });

});

不明觉厉!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请问如何用nodejs通过post发送multipart/form-data类型的http请求? 的相关文章

  • 请一定要使用枚举和常量

    1 魔法值和硬编码 在代码编写的场景中 会遇到提示避免去使用 魔法值 magic numbers 和硬编码 hardcoding 魔法值就是在代码中直接使用的 没有提供任何注释或解释说明其用途和含义的常数值 硬编码指的是在程序中直接使用特定
  • python爬虫学习:第二章:requests模块

    第二章 requests模块 1 基于请求的两个模块 urllib模块 urllib模块比较古老 封装的关于爬虫的相关操作比较麻烦 繁琐 requests模块代替了urllib模块 requests模块 重点 概念 Python中原生一款基
  • Vue这些修饰符节省20%的开发时间

    Vue这些修饰符帮我节省20 的开发时间 作者 李大雷 https segmentfault com a 1190000016786254 为了方便大家写代码 vue js给大家提供了很多方便的修饰符 比如我们经常用到的取消冒泡 阻止默认事
  • 滑窗优化——边缘化

    文章目录 一 从高斯分布到信息矩阵 1 1 SLAM 问题概率建模 1 2 SLAM 问题求解 1 3 高斯分布和协方差矩阵 1 4 样例 1 4 1 样例1 1 4 2 样例2 二 舒尔补应用 边际概率 条件概率 2 1 舒尔补的概念 2

随机推荐

  • 2021年Android开发的前景如何?

    前言 安卓已死的论调已经出现很久了 随着去年裁员潮的出现 这种论调更加疯狂 现在的安卓生态 已经发展的非常好 但由于安卓原生开发的局限性 速度慢 无法跨平台 成本高 导致跨平台开发一直是资本家追逐的目标 这才导致RN Weex Flutte
  • SpringBoot配置logback-spring.xml日志

    在SpringBoot新建 logback spring xml 配置文件 因为SpringBoot官方是推荐这个方式 内容 拷贝复制下来就可以了
  • nvm1.1.10使用bug记录及低级解决方法

    意外发现nvm安装了node10 15 3版本后 并且切换到该版本后 会导致nvm其他版本切换失败 按照实训要求要使用vue2进行web应用开发 需安装node10 15 3版本 好吧 还好之前搞了nvm可以随意切换node版本 没关系 当
  • 怎样学好数据结构

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 6 1 数据结构学习思路 1 数据结构是计算机专业最重要最基础的一门课 对于有过编程经验的人 结合自己的编程体会去领悟它的思想 对于初学者 选
  • 关于java四舍五入时遇五不进位的问题

    在数据处理的过程中 碰到了保留小数点两位和四舍五入的问题 首先也是百度了网上的方法 double a DecimalFormat df new DecimalFormat df setRoundingMode RoundingMode HA
  • 吐血整理,Jenkins配置邮件发送测试报告持续集成,看这一篇就够了...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • caused by: java.lang.ClassNotFoundException: org.springframework.transaction.ReactiveTransactionMana

    SpringBoot启动时报错如下 Java包冲突问题解决 Dspring application admin enabled true javaagent C Program Files JetBrains IntelliJ IDEA 2
  • kafka学习笔记

    1 kafka是什么 kafka是一个高吞吐 分布式 基于发布 订阅的消息系统 最大的特性就是可以实时的处理大量的数据以满足各种需求场景 日志收集 离线和在线的消息消费 等等 2 kakfa的基础架构 topic 主题 kafka根据top
  • 数组和链表的区别

    数组是将元素在内存中连续存放 由于每个元素占用内存相同 可以通过下标迅速访问数组中任何元素 但是如果要在数组中增加一个元素 需要移动大量元素 在内存中空出一个元素的空间 然后将要增加的元素放在其中 同样的道理 如果想删除一个元素 同样需要移
  • 关于request.getinputStream读取一次的问题研究

    public int substract byte src int off int len throws IOException if end start 0 if in null return 1 重点 进行流读取标识 读到末尾 会返回
  • 只有技术人才能看懂的幽默

    面试官 请写出一段体现你水平的代码 我 sudo rm rf 面试官 这体现了你哪方面能力 我 我大学田径队的 1 程序有问题时不要担心 如果所有东西都没问题 你就失业了 2 计算机系的男同学追班里一女同学 结果此女总是躲躲闪闪 男的看没戏
  • swagger3.0访问后台地址

    swagger3 0访问后台地址 最近在学SpringBoot 其中swagger部分 发现后台地址不能访问了 当时导入的坐标为 这个是Gradle坐标 和Maven差不多 compile group io springfox name s
  • 计算机视觉基础7

    语义分割 从像素 pixel level 水平上 理解识别图片的内容 根据语义信息分割 输入 图片 输出 同尺寸的分割标记 每个像素会被识别为一个类别 FCN全卷积网络 所有层都是卷积层 相对位置保持不变 解决降采样后的低分辨率问题 全卷积
  • input类型

    下面通过设置input元素的type属性来演示不同类型的文本框的用法 效果图 当输入不正确的邮箱号 点击提交时 如下图 当输入不正确的网址 点击提交时 如下图 当输入不正确的手机号 点击提交时 如下图 代码如下
  • 不同的人每天工作有什么不同

    Author Skatexg Time 2020 07 17 不同的人每天工作有什么不同 有的人在为完成任务付出劳动 有的人在为有意义的成果付出劳动 为完成任务而付出的劳动是无意义的 只有产生成果的劳动才是有意义的 公司花钱买的是劳动成果
  • UPF learing2:set_level_shifter

    set level shifter 设置level shifter strategy在实现的过程中 level shifter name domain domain name elements list exclude elements l
  • python:10个小孩围成一圈分糖果

    10个小孩围成一圈分糖果 老师顺次分给每个人的糖果数为12 2 8 22 16 4 10 6 14 20 然后按以下规则调整 所有小孩同时把自己的糖果分一半给右边的小孩 糖果数如果变为奇数的人 再向老师补要一块 那多少次调整后 大家的糖果数
  • JavaScript——插入排序、堆排序

    一 插入排序 插入排序是一种简单直观的排序算法 它比冒泡排序 选择排序都更有效率 基本思路 插入排序的工作原理是通过构建有序序列 对于未排序元素 在已排序序列中从后向前扫描 找到对应的位置并插入 插入排序将数组分成 已排序 和 未排序 两部
  • 华为OD机试--路灯覆盖问题

    一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间的距离是100m 每个路灯都有自己的照明半径 请计算第一个路灯和最后一个路灯之间 未照明区间的长度和 输入描述 第一行为一个数N 表示灯的个数 1 100000 第二行为N个空格分隔
  • 请问如何用nodejs通过post发送multipart/form-data类型的http请求?

    请问如何用nodejs通过post发送multipart form data类型的http请求 发布于 4 年前 作者 xuhaijinsky2008 24777 次浏览 请问如果用nodejs通过post发送multipart form