node做中间层,文件上传到java?
发布于 8 年前 作者 Thstone37 6046 次浏览 来自 问答

如题,最近有个需求,node做中间层,接受前端传来的文件,并上传到java后台,网上的很多方法只是在node层接受文件并保存 如:formidable模块实现,求助各位大牛

7 回复

文件上传为啥不是独立服务?能做到,但中转传一次,没啥意义

随手写的 你看看能不能用

function(req, res, next) {

  // 获取 前端上传的文件
  var form = new formidable.IncomingForm()
  form.parse(req, function(err, fields, files) {
    // define err page
    if (err) return res.end('upload file error')

    var tmp_path = files.files.path
    var name = files.files.name

    var target_file = path.join(__dirname, '../public', 'upload', name)

    var target_path = './public/upload/' + name

    var source = fs.createReadStream(tmp_path)
    var dest = fs.createWriteStream(target_path)

    source.pipe(dest)

    dest.on('end', function() {
      url = 'java 接受服务器的 url'
	  // 上传给 java 服务端
      var r = request.post(url, function optionalCallback(error, response, body) {
        if (error) {
          console.log(error)
        }
        if (body.code === '200') {
          res.end('上传成功')
        }
      })
      var pushForm = r.form()
      pushForm.append('custom_file', fs.createReadStream(target_file), {filename: name})
    })
  })
}

如果非要用node,接受到文件保存后,使用request或者干脆http模块转送到java server去。不过如果不是必须,建议不转运

为啥用node转,直接在前面nginx上转发不是更方便么。

@chenjiyong 混合的情况下 同时有多个文件和表单字段数据需要上传?

@leim 老大让我们走node层上传

我是这么写的

var error = null; var opt = { host: host, port: port, path: path, method: ‘POST’, headers: req.headers } delete opt.headers[‘host’]; delete opt.headers[‘origin’]; delete opt.headers[‘referer’]; var htpReq = http.request(opt, function (htpRes) { htpRes.setEncoding(‘utf8’); var _data = “”; htpRes.on(‘data’, function (chunk) { _data += chunk; }); htpRes.on(‘end’, function () { if (error) { res.status(500); res.json(error); } else { res.send(_data); res.end(); } }); });

  htpReq.on('error', function (err) {
    error = err;
  });
  req
    .on('error', function (err) {
      res.status(500);
      res.json(err)
    })
    .on('aborted', function () {
      res.status(500);
      res.json(new Error('Request aborted'));
    })
    .on('data', function (buffer) {
      htpReq.write(buffer);
    })
    .on('end', function () {
      htpReq.end();
    });
回到顶部