美文网首页
nodejs 上传文件转发

nodejs 上传文件转发

作者: aibinMr | 来源:发表于2019-08-14 11:15 被阅读0次

由于公司开发需求,在web端和java服务端需要加一层nodejs业务服务。用nodejs封装java接口。对于一般同步接口,nodejs和java之间只是业务接口api的调用,封装起来比较容易,但是对于数据流,异步的封装来说可能有些东西需要注意的了,我这篇主要想说一下我在处理学习需求要求的过程和想法。
业务需求:
转发用户提交的文件数据及字符串数据。
1:拿到这个需求之后我第一想法是拿到用户的缓存然后做解析处理(我之前对http请求的具体过程并不了解,我的想法只是基于一般的理解)。
但是实际情况是multipart/form-data类型的http请求是包括两两部分,一部分是headers头信息部分,一部分是data数据部分,headers包含了data部分解析的分隔符。这部分信息在请求的同时就发送过来了,是同步的。不需要我们做解析。data数据是异步的需要监听获取,我一开始以为这两部分是揉在一起的。浪费了很多时间。
2:由于一开始并不理解nodejs是如何接收,然后如何在发送的。我就baidu搜索了一个nodejs保存上传文件的插件(formidable),看了一下插件里的写法,知道了通过请求对象req来获取用户请求的数据流的方法 req.on('data', function (buffer) { });然后想通过分析formidable执行原理,然后修改代码实现业务需求,结果做了很多断点之后发现几个问题
1:缓存问题
formidable是把接收到的数据写入临时文件中,如果想把所有数据写入buffer缓存,不太容易确定buffer的大小,buffer要在创建的时候指定大小,而且太大的文件不利于全部写入buffer。
2:使用临时文件处理
如果要用临时文件处理要考虑拼装数据流,要把文件名,分隔符,回车换行等信息重新拼装成数据流发送,而且还要计算数据库长度写在发送的headers里。
3:折中办法
修改了一下需求,让web分开发送字符串数据和文件数据,文件数据我这里接收后直接转发,这样我只需要在nodejs中发起对java服务器接口的http请求然后把接收到的数据修改下headers直接发送就可以。这样免去了buffer长度计算问题和拼接数据流等问题
4:调试流
调试这种数据流格式问题其实可以用一个最小的数据流,小文件做测试然后在后端直接转义打印一下,这样比调试别人的插件可能来的跟简单

  var form = new FormData();
  encoding = 'utf8';

  let object = {};
  object.method = 'POST';
  object.port = 80;
  object.host = 'xxxx.com';
  object.path = '/xxxxxx';
  object.headers = {};
  if (req.headers['accept']) {
    object.headers['accept'] = req.headers['accept']
  }
  if (req.headers['accept-encoding']) {
    object.headers['accept-encoding'] = req.headers['accept-encoding']
  }
  if (req.headers['connection']) {
    object.headers['connection'] = req.headers['connection']
  }
  if (req.headers['content-length']) {
    object.headers['content-length'] = req.headers['content-length']
  }
  if (req.headers['content-type']) {
    object.headers['content-type'] = req.headers['content-type']
  }
  object.headers['Authorization'] = global.serverTocken;
  let data = '';
  let nodeReq = http.request(object, function (res) {
    var gzip = zlib.createGunzip();
    res.pipe(gzip);
    output = gzip;
    output.on('data', function (chunk) {
      data += chunk.toString('utf-8');
    });
    output.on('end', function () {
      self.send(data);
    });
  });

  req
    .on('error', function (err) {
      nodeReq.abort();
      nodeReq.end();
    })
    .on('aborted', function () {
      nodeReq.abort();
      nodeReq.end();
    })
    .on('data', function (buffer) {
      nodeReq.write(buffer);
    })
    .on('end', function () {
      nodeReq.end();
    });

zlib:是处理返回乱码问题

相关文章

  • nodejs 上传文件转发

    由于公司开发需求,在web端和java服务端需要加一层nodejs业务服务。用nodejs封装java接口。对于一...

  • 前端干货链接-持续更新

    前端文件上传 拖拽上传、图片预览、文件上传nodejs-process-excel :nodejs解析或导出exc...

  • nodejs上传文件给服务器 nodejs下载服务器文件转发给

    需求:(nodejs做中间层 接收web前端上传和下载再转发给服务器端)需求1,web前端上传文件到node层,n...

  • 求解一个nodeJs 的文件访问问题

    开发环境 后端:nodeJs 前端:Vue 需求:视频文件上传,视频预览 问题:上传已经可以实现,存在nodeJs...

  • Nodejs 文件上传

    node js 接收表单数据原理 使用 formidable 上传文件

  • NodeJS文件上传

    使用multer上传文件,默认不会给文件添加扩展名 一、package.json 二、app.js 三、uploa...

  • nodejs 文件上传

    图片文件上传、在调试的时候 使用 multer 一直报错,所以最后选择使用 connect-multiparty ...

  • NodeJS 文件上传

    keywords multipart/form-data HTML entity 各依赖功能描述 formidab...

  • ftp 上传模式

    在使用 nodejs 实现 ftp 文件上传的过程中,我发现文本文件可以正常上传,但是图片文件则不行。图片被上传后...

  • node安装(linux)

    1、下载 https://nodejs.org/zh-cn/download/ 2、上传 rz上传文件 3、解压 ...

网友评论

      本文标题:nodejs 上传文件转发

      本文链接:https://www.haomeiwen.com/subject/driwjctx.html