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

转载于:https://www.cnblogs.com/jlliu/p/9082587.html

node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记相关推荐

  1. SecureCRT中文乱码,导致上传到nginx上的文件乱码,访问报404

    问题背景:因使用secureCRT工具,上传文件到linux系统nginx服务上,因部分文件名包含中文,导致访问路径报错404,查看时显示乱码等问题. 一般解决办法 1. 右键点击SecureCRT的 ...

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

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

  3. JAVA 文件上传格式限制_关于servlet文件上传限制文件大小的问题,求高手帮忙

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 首先,能上传900多K的文件1M以上的文件上传不了,我也试着修改限制文件上传的大小,但是设置完了,还是有错误,代码和错误如下: upload2 DiskF ...

  4. php 多文件上传与下载,php实现文件下载跟多文件上传

    php实现文件下载和多文件上传 文件下载: html: 文件上传: html代码:请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: 请选择您要上传的文件: ...

  5. 简单的node文件上传下载及中文乱码问题解决

    1. 基于MEAN的技术栈,使用restful风格的接口 2. 在前端代码中放置文件上传按钮和处理表单数据 <div class="upload-file btn btn-sm btn ...

  6. csv导出文件解决中文乱码和文件名空格问题

    csv导出文件解决中文乱码和文件名空格问题 开发环境 前端:Vue 后端:Java 问题的出现: 1.csv的文件中文内容 excel打开是乱码,wps没问题(wps会进行不同的编码转换,excel不 ...

  7. 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

    微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题 参考文章: (1)微信小程序模板消息(服务通知消息)原始post工具 ...

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

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  9. 解决Node.js 运行的时候出现中文乱码问题

    解决Node.js 运行的时候出现中文乱码问题 一.问题:出现如下乱码 二.解决方案 因为在服务器发送数据,其实是utf-8编码内容 ,但是浏览器不知道你是utf-8编码内容, 浏览器在不知道服务器响 ...

最新文章

  1. mysqlsla slow-query常用用法
  2. Ubuntu环境下TensorFlow 的环境搭建(二)安装TensorFlow(CPU版)
  3. 在继承类中,父类在子类中初始化问题,已解决
  4. Linux——基础IO(总结)
  5. 判断字符串中是否包含Emoji表情代码
  6. hadoop fs.trash 详解
  7. java groovy 表达式_Groovy的基础语法
  8. hadoop安装(包含hive)
  9. python 彩票深度学习_Python数据分析:双色球的深度学习预测
  10. web网站http转成https
  11. C语言绝对地址函数创建和读取函数
  12. css之让尾部永远固定在页面最下方
  13. WhatsApp电脑版和WhatsApp网页版区别?
  14. 五千来多字,就为了聊聊HTTP报文,请求响应头,cookie以及HTTPS加密方式
  15. bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏
  16. h5跳转微信小程序,短信外链外部跳转微信打开任意第三方网址url,抖音跳转微信添加好友直接方法?
  17. 超全!182所大学的考研复试参考书目/复试通知
  18. 免费discuz 白色简洁论坛类源码下载
  19. 【Skill】从 WPS 步入Office 365
  20. 星际公民服务器位置,《星际公民》3.0测试服务器上线 游戏实际内容展示

热门文章

  1. CS144 lab4 计算机网络实验 笔记
  2. python中cumsum_在python里“np.cumsum”这个命令是干什么的?怎么使用?
  3. 计算机多媒体设计徽章,酷毙了:Hackaday将会议徽章设计成一台可编程的电脑
  4. 【python+selenium自动化】使用pytest+allure2完成自动化测试报告的输出
  5. Thinkpad Access Connections实现快速的在各种网络间进行切换
  6. Myeclipse下Maven的配置
  7. 树状数组成段更新模板
  8. 每天一个JavaScript实例-动态省份选择城市
  9. Java达到MySQL数据库备份(两)
  10. 什么是Ext(ExtJs)【转载】