带有express-fileupload的NodeJ中的文件上传无法正常工作

时间:2019-01-25 13:42:58

标签: javascript node.js rest express for-loop

我已经在NodeJs中制作了一个REST API,可以进行文件上传,但是存在一个问题,如果我上传的图像多于2张,则只有2张,3张上传,有时1张损坏。我认为我的Loop为此运行得太快。 打击是我的代码:

app.post('/img-upload', function(req, res) {
  if (!req.files)
    return res.status(400).send({"status":"false", "data":"Image Not Found"});

  // Use the mv() method to place the file somewhere on your server
    for(var key in req.files) {

        thisFile = req.files[key];
        let name = +new Date();
        thisFile.mv('./images/' + name++ +'.png', function(err) {
            if (err) {
                res.send(err);
            }   

        });

    }
        res.json({"status":"File uploaded!"});
});

使用的模块:express-fileupload

2 个答案:

答案 0 :(得分:0)

发布一个可能不是 答案的答案,以解释@PatrickRoberts似乎有观点的评论。

thisFile.mv显然是异步运行的,这意味着function(err){...}可能在 res.json(...)和后面的隐式return之后运行。

尽管Node不应杀死其余的异步进程,但现在告诉用户文件已成功上传还为时过早。 (您可以发送成功,然后您的一个回调会引发错误……但是为时已晚,您无法将该错误发送给客户端。)

有两种选择可以看到这一点。

一个不错的选择

等待所有回调完成以发送成功结果。大概是这样的:

let uploads = [];
for (let k in req.files) {
  req.files[k].mv('/my/path/to.png', function(err) {
    let promise = new Promise(function(resolve, reject) {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
    uploads.push(promise);

  })
} // end for loop
Promise.all(uploads).then(function() {
  res.json({"status":"File uploaded!"});
}).catch(function(err) {
  res.send(err);
});

一个让我感到羞耻的缓慢选择

如果无法解决问题,并假设@PatrickRoberts发现了正确的问题,则可以尝试按顺序进行上传,例如:

function processFile() {
  let file = req.files.shift()
  if (!file) return; // stop sequence condition
  file.mv('/my/path/to.png', function(err) {
    if (err) {
      res.send(err);
    } else {
      processFile();
    }
  })
}
processFile(); // start the recursive and sequential "loop"

如果这些方法都不起作用(第二个较差的选择很慢,但可以明确证明是否涉及res.json / res.send),那么您的问题就出在其他地方。在这种情况下,请提供有关“有时一个文件已损坏”的更多信息:文件是否不完整?服务器显示错误吗?客户端收到错误?在后一种情况下,发生什么错误?

答案 1 :(得分:0)

这对我有用

 let media = req.files; 

 for (let pos in media) {
   media[pos].mv(`./media/${renameFile}`, (err) => {
        if (err) {
            return res.status(500).json({
                ok: false,
                err
            });
        }
    });
}