• 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('xEFxBBxBF', '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);
        }     
    }         
  • 相关阅读:
    数组顺序表
    指针、数组、结构体
    急救模式下安装rpm包
    如何杀死远程服务器到本机的tcp连接
    centos升级内核之后修改内核启动顺序
    rpm yum 等命令无响应的解决方法
    关于ssh 设置的相关总结(ssh最大连接数、ssh连接时长、安全性配置等)
    详解Linux中的日志及用日志来排查错误的方法
    linux 普通用户登陆系统su
    如何更新/升级Red Hat Enterprise Linux内核?
  • 原文地址:https://www.cnblogs.com/jlliu/p/9082587.html
Copyright © 2020-2023  润新知