用户无法直接访问后台接口 需要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

代码:

  const fs = require('fs');
  const http = require('http')
  const iconv = require('iconv-lite');
 * download(){       
          let queryString = this.req.query.filter;
        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格式文件下载 中文乱码问题 + 文件上传笔记的更多相关文章

  1. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  2. node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传

    node.js下四种post提交数据的方式 今天说分享的是其中一种,就是上传文件. Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件 今天主要分享文件上传 对于conne ...

  3. 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题

    因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...

  4. Node.js 博客实例(三)添加文件上传功能

    原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第三章 上传文件眼下有三种方法: 使用 Express 自带的文件上传功能,不涉及数据库 使用 For ...

  5. Springmvc Get请求Tomcat、WebLogic中文乱码问题

    Springmvc Get请求Tomcat.WebLogic中文乱码问题 学习了:http://www.cnblogs.com/qingdaofu/p/5633225.html http://www. ...

  6. java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

    //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...

  7. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  8. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

  9. Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制

    拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...

随机推荐

  1. Python实现的数据结构与算法之链表详解

    一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循 ...

  2. 插头 dp

    插头dp 洛谷 黑题板子? P5056 给出n×m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 1.轮廓线 简单地说,轮廓线就是已决策格子和未决策格子的分界线: 2,插 ...

  3. 098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类

    098 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 02 编写并测试Subject类 本文知识点:编写并测试Subject类 说明: ...

  4. Jmeter之『Xpath提取器』

    1.使用Xpath提取时,有时候需要过滤标题,使用以下语句 //td[@class="r-count" and not(text()="回应")]

  5. 第0天 | 12天搞定Pyhon,前言

    依稀记得,在2014年的某一天,一位运营电商平台的多年好朋友,找我帮忙:一个月内,实现抓取竞争对手在某电商平台上的所有产品信息并统计每个产品的点击率. 说出来有些不好意思,那些年,参与过的产品挺多的, ...

  6. spring-boot-route(十四)整合Kafka

    在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...

  7. 多测师讲解自动化 _rf自动化需要总结的问题(2)_高级讲师肖sir

    1.口述整个自动化环境搭建的过程.以及环境搭建需要哪些工具包以及对应的工具包的作用?2.RF框架的原理?常见的功能?3.公司自动化测试的流程?1.自动化需求的评审2.自动化场景的选择3.自动化工具的选 ...

  8. EfCore3的OwnedType会导致Sql效率问题

    最近主导了旗下某核心项目升级到EfCore3 由于之前Core2升级时候也踩过不少的坑很多东西都有规划和准备,整体上还是没出太大问题 但是最近突然发现efcore对于使用了ownedType的生成语句 ...

  9. python 微信小程序自动化

    微信小程序自动化 https://www.cnblogs.com/yyoba/python27 - FautoTesthttps://www.cnblogs.com/yyoba/p/9973731.h ...

  10. Linux 发行版本简介

    1991年的10月5日Linus Benedict Torvalds在comp.os.minix 新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like ker ...