如何强制路由等待客户端上传文件完成?



我试图使用夏普缩小服务器上的多个文件,一旦他们被客户端上传。我一直遇到的问题是,当夏普试图访问这些文件时,这些文件似乎还没有完成上传。我总是收到"文件不存在"或"未知文件类型"的提示。或者其他类似的错误

下面是我正在做的一个简单的例子:

app.post("/update", upload.array("images"), function(req, res){
let promises = [];

for(let i = 0; i < req.files.length; i++){
let newImage = sharp(req.files[i].filename)
.resize(1000, 750)
.toFile(`/myFiles/${req.files[i].filename}.webp`)
.catch((err)=>{
console.error(err);
});

promises.push(newImage);
}

Promise.all(promises)
.then((response)=>{
//Do things
})
.catch((err)=>{
console.error(err);
});
}

使用multer上传:

const multer = require("multer");
const upload = multer({
dest: "./uploads"
});

错误的例子:

[Error: /home/leemorgan/projects/javascript/market/market-api/uploads/422d9803530522eaeba6f176a8258ec8: unable to open for read
unix error: No such file or directory
]
[Error: Input file contains unsupported image format]

有时所有的文件都会抛出错误,有时没有,而且您永远不知道哪个文件会抛出哪个错误。所以,我假设这里有一个竞争条件,即文件还没有完成上传到服务器。

我如何强制承诺或程序等待文件完全完成上传后再尝试修改它们?

正如jfriend00所评论的那样,multer在调用处理程序之前完成了文件的上传。

问题是我在Promise.all()完成其业务之前调用fs.unlink()来删除原始文件。因此,在夏普访问/编辑文件之前,该文件已被删除。

最新更新