如何在节点js中使用scp2将文件复制到远程服务器?

我想使用scp2包将节点js中的文件从本地服务器复制到远程服务器。 首先..文件复制或移动到远程服务器后,上传到本地服务器使用multer器。

我的代码:

 exports.newFileUpload = function(req , res , next){ var storage = multer.diskStorage({ //multers disk storage settings destination: function (req, file, cb) { cb(null, 'uploads/'); }, filename: function (req, file, cb) { var datetimestamp = Date.now(); cb(null, datetimestamp+ '-' +file.originalname); } }); var upload = multer({ storage: storage, limits: { fieldSize: 25 * 1024 * 1024 }}).array('file'); upload(req,res,function(err){ console.log(req.body); console.log(req.files); if(err){ res.json({error_code:1,err_desc:err}); console.log("Error Occured", err); return; }else{ client.scp(req.files[0].path, { host: 'www.do********.in', username: 'username', password: '*********', path: '/uploads/' }, function(err) { console.log(req.files[0].path); console.log("files uploaded in remote server"); res.json({error_code:0,err_desc:null}); }); } }); } 

file upload到本地服务器是完美的工作,然后到远程服务器抛出错误

错误:

 { date: 'Mon Nov 13 2017 01:00:22 GMT+0530 (India Standard Time)', process: { pid: 5664, uid: null, gid: null, cwd: 'D:\\sample', execPath: 'C:\\Program Files\\nodejs\\node.exe', version: 'v8.2.1', argv: [ 'C:\\Program Files\\nodejs\\node.exe', 'D:\\sample\\app.js' ], memoryUsage: { rss: 69619712, heapTotal: 45162496, heapUsed: 39166256, external: 149849 } }, os: { loadavg: [ 0, 0, 0 ], uptime: 3537.1088452 }, trace: [ { column: 11, file: 'util.js', function: 'Object.exports._errnoException', line: 1024, method: '_errnoException', native: false }, { column: 20, file: 'util.js', function: 'exports._exceptionWithHostPort', line: 1047, method: '_exceptionWithHostPort', native: false }, { column: 14, file: 'net.js', function: 'TCPConnectWrap.afterConnect [as oncomplete]', line: 1150, method: 'afterConnect [as oncomplete]', native: false } ], stack:[ 'Error: Can\'t set headers after they are sent.', ' at validateHeader (_http_outgoing.js:504:11)', ' at ServerResponse.setHeader (_http_outgoing.js:511:3)', ' at ServerResponse.header (D:\\sample\\node_modules\\express\\lib\\response.js:730:10)', ' at ServerResponse.send (D:\\sample\\node_modules\\express\\lib\\response.js:170:12)', ' at ServerResponse.json (D:\\sample\\node_modules\\express\\lib\\response.js:256:15)', ' at D:\\sample\\routes\\part.js:302:10', ' at Client.closeHandler (D:\\sample\\node_modules\\scp2\\lib\\scp.js:48:13)', ' at emitNone (events.js:105:13)', ' at Client.emit (events.js:207:7)', ' at Client.<anonymous> (D:\\sample\\node_modules\\scp2\\lib\\client.js:88:10)', ' at emitNone (events.js:105:13)', ' at Client.emit (events.js:207:7)', ' at Socket.<anonymous> (D:\\sample\\node_modules\\ssh2\\lib\\client.js:225:10)', ' at emitOne (events.js:115:13)', ' at Socket.emit (events.js:210:7)', ' at Pipe._handle.close [as _onclose] (net.js:549:12)' ] } 

无法识别错误,等待build议或可能的方法来解决问题。

提前致谢 !

使用multer上传文件到远程服务器是不可能的,但是我们可以使用multer-sftp, scp, ssh技术

使用Node Js将file upload到远程服务器时,我们需要注意几点

  1. 用户名和密码应该是正确的
  2. 在远程服务器上应该打开相应的端口号
  3. 远程目录应具有写访问权限

使用scp2将文件移动到远程服务器的工作代码:

 exports.newFileUpload = function(req , res , next){ var storage = multer.diskStorage({ //multers disk storage settings destination: function (req, file, cb) { cb(null, 'uploads/'); }, filename: function (req, file, cb) { var datetimestamp = Date.now(); cb(null, datetimestamp+ '-' +file.originalname); } }); var upload = multer({ storage: storage, limits: { fieldSize: 25 * 1024 * 1024 }}).array('file'); upload(req,res,function(err){ console.log(req.body); console.log(req.files); if(err){ res.json({error_code:1,err_desc:err}); console.log("Error Occured", err); return; }else{ client.scp(req.files[0].path, { host: 'host', username: 'username', password: '*********', path: '/uploads/' }, function(err) { console.log(req.files[0].path); console.log("files uploaded in remote server"); }); } }); } 

注意:应安装所需的软件包以及在代码中声明需要的东西。

参考文献: multer-sftp , scp2 , node-ssh