博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记
阅读量:5126 次
发布时间:2019-06-13

本文共 2677 字,大约阅读时间需要 8 分钟。

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

以表单提交为例:

  
  
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

你可能感兴趣的文章
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>