强大的多文件上传- ENOENT,没有这样的文件或目录

Formidable multi-file upload - ENOENT, no such file or directory

本文关键字:文件 ENOENT      更新时间:2023-09-26

我知道这个问题已经被问过了,但我的头脑已经被我无法让这个工作吹了。我试图上传多个图像到我的服务器与以下代码:

var formidable = require('formidable');
var fs = require('fs');

router.post('/add_images/:showcase_id', function(req, res){
    if(!admin(req, res)) return;
    var form = new formidable.IncomingForm(),
    files = [];

    form.uploadDir = global.__project_dirname+"/tmp";
    form.on('file', function(field, file) {
        console.log(file);
        file.image_id = global.s4()+global.s4();
        file.endPath = "/img/"+file.image_id+"."+file.type.replace("image/","");
        files.push({field:field, file:file});
    });
    form.on('end', function() {
        console.log('done');
        console.log(files);
        db.get("SOME SQL", function(err, image_number){
            if(err){
                console.log(err);
            }
            var db_index = 0;
            if(image_number) db_index = image_number.image_order;
            files.forEach(function(file, index){
                try{
                    //this line opens the image in my computer (testing)
                    require("sys").exec("display " + file.file.path);
                    console.log(file.file.path);
                    fs.renameSync(file.file.path, file.file.endPath);
                }catch (e){
                    console.log(e);
                }
                db.run( "SOME MORE SQL"')", function(err){
                    if(index == files.length)
                        res.redirect("/admin/gallery"+req.params.showcase_id);
                });
            });
        });
    });
    form.parse(req);
});

通过系统调用打开图像的行工作得很好,但是我继续得到:Error: ENOENT, no such file or directory '/home/[username]/[project name]/tmp/285ef5276581cb3b8ea950a043c6ed51'通过rename语句。

file.file.path的值为:/home/[username]/[project name]/tmp/285ef5276581cb3b8ea950a043c6ed51

我很困惑,什么都试过了。我做错了什么?

可能是因为目标路径不存在或者您没有写权限。

你得到的错误是由于nodejs中的错误而引起的误导,参见:

  • https://github.com/joyent/node/issues/5287
  • https://github.com/joyent/node/issues/685

考虑添加:

console.log(file.file.endPath);

fs.renameSync调用之前,检查目标路径是否存在并且您的应用程序可写

您声明的表单。因此,请注意,Formidable不能只使用NodeJS就开箱即用。除非您要使用提示模块之类的东西进行输入。如果你正在使用HTML,你需要像Angular、React或Browserify这样的东西来让它访问你的界面。