【问题标题】:In Node-RED, how do I upload to a node with the given configuration and retrieve the configuration later?在 Node-RED 中,如何上传到具有给定配置的节点并稍后检索配置?
【发布时间】:2016-11-02 22:22:38
【问题描述】:

我在 Bluemix 上使用 Node-RED,我想让用户上传一个文档,这里是流的函数/模板中的相关代码片段

<form action="/upload" method="POST">
     <h1>Upload PDF</h1>
<input type="file" name="myFile" />
<input type="submit" />
</form>

当我运行它时,我选择了一个文件并按“提交”,但随后出现了消息 Cannot POST /upload 然后我去了http://flows.nodered.org/node/node-red-contrib-http-multipart ,在示例中它说


您可以使用以下配置上传到节点:

[{ "name": "myFile" }]

并在节点的输出端口上使用以下函数访问文件

var fields = msg.req.fields;
msg.fields = Object.keys(fields);
var myFile = fields["myFile"][0];
msg.localFilename = myFile.path
...

1) 如何上传节点配置?

2) 获得文件名后,如何检索它以发送到下一个服务? - 下一个服务是“转换” - 它接受文件名。

【问题讨论】:

  • 我花了一些时间在这上面,但我也无法让它正常工作。但是我没有收到您的无法发布错误。确保您的 http-multipart 节点位于 /upload 上(根据您的 html)并具有相应的 http 响应节点。
  • Node-Red 是一个开源代码,所以你可能想试试他们的社区,看看你是否可以在那里找到专家来帮助groups.google.com/forum/#!forum/node-red

标签: node.js ibm-cloud node-red watson


【解决方案1】:

要使其工作,您需要:
1- 连接到放置表单的 html 节点的经典 http 节点:

<form enctype="multipart/form-data" action="/fileUploaded" method="POST">
        <input type="file" name="myFile" />
        <input type="submit" />
</form>

2- 然后将 HTTP 多部分节点与字段:

[{ "name": "myFile"}]

You link that node to a function node with the following code :
var fields = msg.req.files;
msg.fields = Object.keys(fields);
var myFile = fields["myFile"][0];
var fs = global.get('fs');
var inStr = fs.createReadStream(myFile.path);
var outStr = fs.createWriteStream('/app/public/upload/testUpload');
inStr.pipe(outStr);
msg.localFilename ='/upload/testUpload'
return msg;

您需要在 /app/public/ 下有一个名为“upload”的文件夹
你还需要'fs':
在 functionGlobalContext 的 bluemix-settings.js 中添加 fs:require('fs')
在 package.json 中,添加 "fs":"x.x"
该文件将被复制到那里:/app/public/upload/testUpload
然后我们将能够通过下一个节点中的 msg.localFilename 访问它,例如在这样的 HTML 页面中:

<html>
    <body>
        <h1>Job Done</h1>
        <a href=".{{localFilename}}">File uploaded here</a>
    </body>
</html>

【讨论】:

  • 啊,我明白了。很好的答案罗曼。
  • 我强烈建议您使用“node-red-node-file”节点,而不是直接在函数节点中使用fs模块。
【解决方案2】:
  1. 为 node-red 安装 multer,然后重新启动 node-red。

npm install node-red-contrib-http-multipart

  1. 正确完成安装后,您将看到 httpInMultipart 节点。
  2. 基本html文件上传代码:

    <form action="/upload" enctype="multipart/form-data" method="POST">
        <input type="file" name="myFile" />
        <input type="submit" />
    </form>
  1. httpInMultipart->函数->Http响应节点

配置 httpInMultipart 节点: 方法:POST 网址:/上传 字段:[ { "name": "myFile"} ]

在函数节点中编写如下代码:

var file = msg.req.files;
var filesize
msg.test=file;
var localFilenamePath = file.myFile[0].path;
var fileSize = file.myFile[0].size;
var response={};
if(msg.test)
    {
        response.statusCode=0;
        response.localFilenamePath=localFilenamePath;
        response.fileSize = fileSize;
        response.sendMessage="Successful";
    }
else
    {
        response.statusCode=1;
        response.sendMessage="Failed";
    }
msg.payload=response;
return msg;

还有,瞧!我们完成了!

【讨论】:

  • 嗨@Siena,当我尝试安装节点 http-multipart 时,出现以下错误。有什么建议么? npm WARN enoent ENOENT:没有这样的文件或目录,打开 'c:\Program Files\nodejs\package.json' npm WARN nodejs 没有描述 npm WARN nodejs 没有存储库字段。 npm WARN nodejs No README data npm WARN nodejs No license field.
  • 节点是否安装正确?使用node -v检查
  • 尝试安装节点时,您可能位于错误的目录中。确保您位于项目的文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多