如题,最近有个需求,node做中间层,接受前端传来的文件,并上传到java后台,网上的很多方法只是在node层接受文件并保存 如:formidable模块实现,求助各位大牛
文件上传为啥不是独立服务?能做到,但中转传一次,没啥意义
随手写的 你看看能不能用
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();
});