4

私は手ごわいを使用して NodeJS でファイルのアップロードを処理しています。これは私にとってはうまくいきます。ここで、アップロードをもう少し構成したいと思います。アップロードでAngularからフィールドを渡しています。これはproject_id. この ID で名前を付けたアップロードにフォルダーを作成し、そのフォルダーにファイルを書き込みたいと考えています。

そのため、ディレクトリが存在するかどうかを確認し、存在しない場合は作成してfs.mkdirからファイルを書き込みます。これを試してみると、EINVAL, renameエラーと HTTP 500 ステータス コードが表示されます。

これは私の試みですが、これを修正する方法を知っている人はいますか?

 app.post('/uploads/', function(req, res, next){
        var form = new formidable.IncomingForm();
        form.keepExtensions = true;
        form.parse(req, function(err, fields, files){
            if (err) next (err);
            fs.exists('uploads/' + fields.project_id + '/', function (exists){
                if (exists) {
                    fs.rename(files.upload.path, 'uploads/' + fields.project_id + '/' +files.upload.name, function(err){
                        if (err) next (err);
                        res.render('profile.ejs',{
                            user: req.user
                        });
                    });
                } else {
                    fs.mkdir('uploads/' + fields.project_id + '/', function (err){
                        if (err) next (err);
                    });
                    fs.rename(files.upload.path, 'uploads/' + fields.project_id + '/' + files.upload.name, function(err){
                        if(err) next (err);
                        res.render('profile.ejs',{
                            user:req.user
                        });
                    });
                }
            });
        });
    });
4

1 に答える 1

3

ディレクトリが作成される前にファイルの名前を変更しようとしています。また、使用fs.existsはお勧めできません。また、この機能は将来廃止される予定です。

コードにいくつかの変更を加えましたpath。モジュールを使用してパスを作成できます。また、ディレクトリがすでに存在するかどうかに関係なく、ディレクトリを作成してみてください。存在する場合は、エラー コード EEXIST を無視します。

更新されたコード:

// add this to the beggining
var path = require('path');

app.post('/uploads', function(req, res, next){
    var form = new formidable.IncomingForm();
    form.keepExtensions = true;
    form.parse(req, function(err, fields, files){
        if (err) next (err);
        fs.mkdir(path.resolve('uploads', fields.project_id), function (err) {
            if (err && err !== 'EEXIST') {
                next(err);
            } else {
                fs.rename(files.upload.path, path.resolve('uploads', fields.project_id, files.upload.name), function(err){
                    if(err) next (err);
                    res.render('profile.ejs',{
                        user:req.user
                    });
                });
            }
        });
    });
});
于 2015-05-10T11:25:46.823 に答える