javascript - 将数据从 res.write() 传递到强大的文件名
问题描述
我使用节点来允许用户上传文件:
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
http.createServer(function (req, res) {
if (req.url == '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var oldpath = files.filetoupload.path;
var newpath = 'team_1_uploads/' + files.filetoupload.name + files.filetoupload.token;
fs.rename(oldpath, newpath, function (err) {
if (err) throw err;
res.write(' FILE UPLOADED!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<div align="center">');
res.write('<html>');
res.write('<body>');
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input id="file_input" type="file" name="filetoupload" style="margin-left: 100px; margin-bottom: 10px; color: transparent"><br>');
res.write('<input id="submit_button" type="submit">');
res.write('</form>');
res.write('</body>');
res.write('</html>');
res.write('</div>');
return res.end();
}
}).listen(3131);
如您所见,我正在尝试将令牌附加到文件名上。上传按钮通过前端的 iframe 由节点提供。我可以使用 postMessage 将令牌传递给 res.write(),方法是将以下脚本添加到 res.write():
res.write("<script>window.addEventListener('message', function(event) { document.getElementById('file_input').dataset.token = event.data; global_hold_token = event.data; })</script>");
这通过使用表单元素上的数据属性将标记设置为表单元素。使用 postMessage 从前端接收消息:
$('#my_frame')[0].contentWindow.postMessage(token, '*')
我想我可以使用 formidable 解析数据属性。但是节点似乎无法访问表单元素上的数据属性,即使它可以访问名称。
解决方案
是?token=xxxxxx
一个 GET 参数。您可以从req
对象下的req.query
对象中获取这些
http://expressjs.com/en/api.html#req.query
所以在你的情况下,它将在req.query.token
推荐阅读
- vue.js - 尽管在 VUEJS 中的两个组件之间切换,但保存选定的输入值
- angular - 如何在网络选项卡中隐藏来自 API 调用的 Angular 响应
- javascript - 如何让反应知道我单独加载的 HTML?
- r - 如何根据R中的字符串向字符串向量添加特殊单位
- c# - MysqlConnector 字符串连接中的特殊字符
- neural-network - 没有 torch.no_grad() 的就地参数更新
- vue.js - Vue Utils 无效的道具
- php - 如何获取访问确切页面的客户信息?
- lua - 我的数据存储系统不工作,以为我收到了成功保存的消息。罗布乐思
- python - 如何通过 Slack API 回复用户 DM?