zoukankan      html  css  js  c++  java
  • 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);
        }     
    }         
  • 相关阅读:
    SSIS 学习之旅 FTP文件传输-脚本任务
    SSIS 学习之旅 FTP文件传输-FTP任务
    SSIS 学习之旅 数据同步
    SSIS 学习之旅 第一个SSIS 示例(二)
    SSIS 学习之旅 第一个SSIS 示例(一)(下)
    SSIS 学习之旅 第一个SSIS 示例(一)(上)
    图解 VS2015 如何打包winform 安装程序
    常用SQL Server 语句
    蓝桥杯 算法训练 Remember the A La Mode
    Competition in Swiss-system——2019CCPC哈尔滨 C题
  • 原文地址:https://www.cnblogs.com/jlliu/p/9082587.html
Copyright © 2011-2022 走看看