使用Nodejs(fs)来访问inputtypes为file的文件

我无法读取不同位置的文件(Node项目目录除外)。 我需要读取一个私钥文件(可能位于文件系统的任何位置),并通过sftp传输一些yaml / yml文件(也可能位于任何位置)。 这些文件在一个文件input字段中select,该字段通过我的index.js(在Node中)的post方法访问。 问题是当我试图读取文件时,我得到一个文件不存在的错误,特别是因为目录默认为Node项目目录。

例如:
d:/path/到/节点/项目
d:/这/是/在/的/ keyis

它会尝试阅读这个文件:
d:/path/到/节点/项目/ keyis

我不知道为什么我只能得到文件名。 我知道接收整个path是一个安全风险,但我需要的path,即使它不是在任何阶段打印。

这是html表单的代码:

<form id="file-upload" name="uploadform" method="post" action="/upload" onsubmit="update()"> <input type='text' id='username' class="btn btn-lg btn-default" name='username' placeholder='Enter Username' style="color:#000"><br> <h3>Select Key:</h3><input type='file' id='key-select' name='keySelect'><br> <h3>Select Yaml:</h3><input type="file" id="file-select" name="yamlfiles[]" multiple accept=".yml, .yaml"/><br> <button type="submit" class="btn btn-lg btn-default" id="upload">Upload Data</button> </form> 

然后在index.js中:

 router.post('/upload', function(req,res) { // Create a new connection var fs = require('fs'); var Connection = require('ssh2'); var c = new Connection(); // Get the files to be uploaded var files = req.body.yamlfiles; var uname = req.body.username; var key = req.body.keySelect; ... ... c.connect( { host: 'some_host', port: 22, username: uname, privateKey: fs.readFileSync(key) } ); 

基本上readFileSync不工作,除非'key'在项目path中。 有什么我失踪了吗? “文件”也是如此。

好吧,我似乎解决了我自己的问题。 对于将来面临这个问题的任何人,我会粗略地概述一下我的解决scheme。

我需要添加: enctype="multipart/form-data"到我的表单。 我曾经尝试过,但我不明白我需要在服务器端进行更改。 使用nodejs模块: https : //github.com/andrewrk/node-multiparty我可以parsing表单数据到一个可读的对象。 我的服务器端代码,然后成为这样的事情:

 router.post('/upload', function(req,res) { // Create a new connection var fs = require('fs'); var multiparty = require('multiparty'); var util = require('util'); var Connection = require('ssh2'); var c = new Connection(); // Get the files to be uploaded var form = new multiparty.Form(); form.parse(req, function(err, fields, files) { // Each element of the object is an array console.log("form parsed"); // yamlfiles is an array anyway var yamlfiles = files.yamlfiles; // username is just a text field, so the 0th element is username var uname = fields.username[0]; // files is a single file, so the 0th element is my key var key = files.keySelect[0]; ... ... // access key with key.path (will be a fakepath) fs.readFileSync(key.path); // access name with key.originalFilename console.log(key.originalFilename); 

经过一些摆弄它完美的作品。 我希望这能帮助未来面对这个问题的任何人,并非常感谢那些向我提供帮助的人。