【问题标题】:Using Nodejs (fs) to access files selected with input type=file使用 Nodejs (fs) 访问使用 input type=file 选择的文件
【发布时间】:2014-05-27 10:54:59
【问题描述】:

我在读取不同位置(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)
    }
);

除非 'key' 在项目路径中,否则基本上 readFileSync 不起作用。有什么我想念的吗? “文件”也是如此。

【问题讨论】:

  • 如果您需要更多信息,请询问:)
  • 你想获取上传文件的路径吗?然后你不能:出于明显的安全原因,浏览器不会发送它。
  • 在这种情况下,你应该首先意识到key的值是什么。
  • 我要做的就是通过 sftp 传输我在 html 页面中选择的文件(从我计算机上的某个目录)。 key 的值实际上只是名称(如果我打印它)。有什么安全的方法可以通过路径吗?

标签: node.js file input sftp fs


【解决方案1】:

好的,我似乎已经解决了我自己的问题。对于将来遇到此问题的任何人,我将大致概述我的解决方案。

我需要在我的表单中添加: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);

经过一番摆弄之后,它完美地工作了。我希望这对将来遇到此问题的其他人有所帮助,非常感谢那些为我提供帮助的人。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2011-06-05
    • 2015-06-21
    • 1970-01-01
    • 2010-11-20
    • 2011-05-18
    相关资源
    最近更新 更多