【问题标题】:Node.js file uploading using Formidable - events are not getting fired使用 Formidable 上传 Node.js 文件 - 事件不会被触发
【发布时间】:2019-06-12 14:39:18
【问题描述】:

我正在尝试使用 Node.js 和 Formidable 模块进行文件上传。

npm install formidable

然后我做了这个,请阅读注释 - 我可以解释每个函数的作用并描述算法:

// get access to the files that were sent;
// at this time I don't want the files to be uploaded yet;
// in the next function I will validate those files.
function form_parse() {
    form.parse(req, (err, fields, files) => {
      if (err) return req.Cast.error(err);
      if (Object.keys(files).length==0) return req.Cast.badRequest();
      req.files = files;
      return validate_files();
    });
  }

  // I made an object with options to validate against the
  // files. it works and continues to the process_files()
  // function only whether files are verified.
  function validate_files() {
    let limitations = require('../uploads-limitations');
    try {
      limitation = limitations[req.params.resource];
    } catch(err) {
      return req.Cast.error(err);
    }
    let validateFiles = require('../services/validate-files');
    validateFiles(req, limitation, err => {
      if (err) return req.Cast.badRequest(err);
      return process_files();
    });
  }

  // here is the problem - form.on doesn't get fired.
  // This is the time I want to save those files - after
  // fully verified
  function process_files() {
    form.on('file', function(name, file) {
      console.log(`file name: ${file.name}`);
      file.path = path.join(__dirname, '../tmp_uploads/' + file.name);
    });
    form.on('error', err => {
      return req.Cast.error(err);
    });
    form.on('end', () => {
      console.log(`successfully saved`);
      return req.Cast.ok();
    });
  }

  form_parse();

如您所见和我所描述的 - 验证有效,但是当我想实际保存这些文件时,form.on(事件)不会被触发。

【问题讨论】:

  • 是的,因为在您的流程结束时,在解析和验证之后,您附加了事件侦听器。这应该首先完成,开始解析之前。因为这些事件(存档、错误、结束)发生在解析期间,而不是之后。
  • 我怎样才能让它正常工作?
  • 我已经添加了完整的答案。

标签: node.js express file-upload formidable


【解决方案1】:

是的,因为在您的流程结束时,在解析和验证之后,您附加了事件侦听器。这应该在开始解析之前首先完成。因为这些事件(存档、错误、结束)发生在解析期间,而不是之后。

 form.on('file',...) // First, attach your listeners
    .on('error', ...)
    .on('end', ...);

form.parse(req) // then start the parsing

【讨论】:

  • 我不明白。如果我在文件上使用,我可以在文件实际上传之前进行验证?这意味着 - form.on('file') 只是给我一个文件实例,以便我可以对其运行验证,但它实际上并没有上传(并接收实际的文件数据)文件,不是吗?
  • form.on 不会触发任何事情。它不执行任何操作。它创建事件侦听器。它所做的是添加一个小家伙,他的工作是“每当表单出现错误或完成时,做某事”。然后小家伙等着听着。 然后你开始解析你的表单,事件发生了,小家伙开始注意到事件并做事。目前,您正在添加小家伙一切都被解析并发生后,所以他会听,但什么都没有发生。
  • 我在询问是否可以在将文件保存到我的服务器之前验证文件的扩展名和大小。而且,在用户完全等待之前,所有文件实际上都被转换到了服务器上(并使服务器一无所获)
  • @Raz 在您的第一条评论中,您所说的是错误的。该文件已经上传到服务器,但在内存中尚未保存。另请查看How to cancel user upload in Formidable (Node.js)?
  • @Raz 这与之前讨论的任何内容有什么关系?文件扩展名?什么文件扩展名?这听起来像是一个完全不同的问题/问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多