我在读取其他位置(Node项目目录除外)中的文件时遇到麻烦。我需要读取一个私钥文件(可以位于文件系统上的任何位置),并通过sftp传输一些yaml / yml文件(也可以位于任何位置)。这些文件是在文件输入字段中选择的,可以通过我的index.js(在Node中)中的post方法访问。问题是,当我尝试读取文件时,出现错误,指出该文件不存在,特别是因为该目录默认为Node项目目录。
例如:
D:/ path / to / Node / project
D:/ this / is / where / the / keyis
它将尝试读取此文件:
D:/ path / to / Node / project / keyis
我不确定为什么只得到文件名。我知道接收整个路径会带来安全风险,但是即使在任何阶段都未打印出来,我还是需要该路径。
这是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本质上不起作用。有什么我想念的吗?“文件”也是如此。
好吧,我似乎已经解决了自己的问题。对于将来遇到此问题的任何人,我都会概述我的解决方案。
我需要在enctype="multipart/form-data"
表单中添加:我以前曾经尝试过,但是我不明白我需要在服务器端进行哪些更改。使用nodejs模块:https : //github.com/andrewrk/node-multiparty我可以将表单数据解析为可读对象。然后,我的服务器端代码如下所示:
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);
经过一番摆弄之后,它运行完美。我希望这对将来会遇到此问题的其他人有所帮助,并非常感谢那些为我提供帮助的人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句