node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记
用户无法直接访问后台接口 需要node端转发请求 并将数据以.csv文件格式生成以供客户端下载。 很不幸出现了中文乱码的问题
挖了各种坟帖,下了各种依赖包,csv、json2csv、bufferHelper、iconv-lite等等 多次尝试后 发现真正起作用的只有iconv-lite这个库
基本思路就是: 1. 修改header 信息,指定文件名和文件格
2. 设置返回值为二进制编码式
3. 将读取的数据段以二进制格式拼接成Buffer 此时buffer数据为GBK编码(后台返回数据的编码)的二进制数
4. 将Buffer字符串以GBK编码(注意这里需要与接口返回编码格式一致)解码 至此完成返回数据的中文乱码解决 此时为GBK格式的字符串
5. 将解码的字符串生成一个buffer
6. 将buffer以GBK格式编码 至此完成.csv文件需要的数据格式
如果接收的数据为JSON数据,就只要将其拼接成字符串,然后做1,5,6步就可以了
如果需要转成UTF-8格式 将第2步改成:
data = Buffer.concat([new Buffer('\xEF\xBB\xBF', 'binary'), new Buffer(_data)]); //excel需要BOM,每次写入数据前先加入一个utf8的BOM。utf-8对应的BOM是 EF BB BF
代码:
let fileUrl = URL + queryString;
// download file
let _this = this;
http.get(fileUrl, function (response) {
//设置请求头
_this.res.setHeader('Content-disposition', 'attachment; filename=orderData.csv'); response.setEncoding('binary'); //二进制binary
var data = '';
response.on('data', function (_data) { //node的http模块对报文内容通过data事件触发,我们只需以流的方式处理即可
data = Buffer.concat([new Buffer('binary'), new Buffer(_data)]);
}).on('end', function () {
data = iconv.decode( data.toString(), 'GBK');
var buffer = new Buffer(data);
var str=iconv.encode(buffer,'GBK');
_this.res.send(str)
})
})
表单提交:(朴灵深入浅出nodeJs)
以表单提交为例:
<form action="/upload" method="post">
<label> <input type="text" /> </label>
<input type="submit" />
</form>
var hasBody = function(){
return 'transfer-encoding' in req.headers || 'content-length' in req,headers;
}
function (req, res){
if( hasBody(req) ){
var buffers = [ ];
req.on( 'data', function (chunk){
buffers.push( chunk );
} )
req.on( 'end', function ( ){
req,rawBody = Buffer.concat(buffers).toString( );
handle(req,res);
} )
}else{
habdle(req, res)
}
}
var handle = function(req, res) {
if( req.headers['content-type'] === 'application/x-www-form-urlencode' ){ //报文体
req.body = querystring.parse(req.rawBody);
}
todo(req, res);
}
文件上传:(朴灵深入浅出nodeJs)
需要指定表单属性enctype为multipart/form-data
引入模块formidable,它基于流式处理报文,将接受到的文件写入到系统的临时文件夹中,并返回对应的路径
function (req, res){
if(hasBody(req)){
if(mime(req) === 'multipart/form-data') {
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files){
req.body = fields;
req.files = files;
handle(req, res);
})
}
} else{
handle(req, res);
}
}
node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记的更多相关文章
- HTTP POST请求报文格式分析与Java实现文件上传
时间 2014-12-11 12:41:43 CSDN博客 原文 http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...
- node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传
node.js下四种post提交数据的方式 今天说分享的是其中一种,就是上传文件. Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件 今天主要分享文件上传 对于conne ...
- 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题
因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...
- Node.js 博客实例(三)添加文件上传功能
原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第三章 上传文件眼下有三种方法: 使用 Express 自带的文件上传功能,不涉及数据库 使用 For ...
- Springmvc Get请求Tomcat、WebLogic中文乱码问题
Springmvc Get请求Tomcat.WebLogic中文乱码问题 学习了:http://www.cnblogs.com/qingdaofu/p/5633225.html http://www. ...
- java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题
//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...
- Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...
- HttpClient多文件上传代码及普通参数中文乱码问题解决
该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...
- Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制
拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...
随机推荐
- Thinkphp中D方法和M方法的区别
两者共同点都是实例化模型的,而两者不同点呢?一起来看一下: $User = D('User');括号中的参数User,对应的模型类文件的 \Home\Model\UserModel.class.php ...
- Dockerize ASP。净样板项目
Get the source code from the Github repository. 介绍 在这篇文章中,我将一步步地向你展示如何在Docker上运行ABP模块零核心模板.然后,我们将讨论其 ...
- JS原生练习
1.输出1-10000之间的数 <script> for(i=1;i<=10000;i++) { document.write(i + "<br>") ...
- 要是想让程序跳转到绝对地址是0x100000去执行
要对绝对地址0x100000赋值,我们可以用 (unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? *((void (* ...
- 多测师讲解自动化测试_rf运行无日志(解决方法)_高级讲肖sir
rf运行无日志(解决方法) 出现现象: 方法: 1.先在套件里面导入OperatingSystem库 2.在套件中新建一个关键字套件点击右键选择new user keyword关键 字的名称为:kil ...
- day17 Pyhton学习 内置函数继续
1. locals 本地作用域/局部作用域 会随着位置的改变而改变 2.globals 全局作用域 永远不变,永远是全局 3.complex:复数 实数(有理数和无理数) 某一个数的平方是-1 ...
- 什么是C和C++标准——小白必看
本文简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的. 我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了 ...
- lumen-ioc容器测试 (1)
lumen-ioc容器测试 (1) lumen-ioc容器测试 (2) lumen-ioc容器测试 (3) lumen-ioc容器测试 (4) lumen-ioc容器测试 (5) lumen-ioc容 ...
- 并发压测 jmeter使用教程
百度网盘下载软件 提取码: 2nur 第一步:首先从jmeter的官网下载jmeter,目前最新版本为4.0,支持的JDK最高为1.8 下载地址: jmeter:http://jmeter.apach ...
- centos8安装lvs
一,配置ip转发 [root@localhost sysctl.d]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 1 说明:如果net.ipv ...