web-dev-qa-db-ja.com

Node.js TypeError:未定義のプロパティ「ファイル」を読み取れません

私はnode.jsを学んでいるだけで、expressと multer を使用して簡単なファイルアップロードを行うのに苦労しています。

フォームは次のとおりです。

私のconfigure.js 私が持っています:

app.use(express.static(path.join(__dirname, 'public')));
app.use(multer({dest:'../public/upload/temp'}).single('file'));

そしてその image.jsコントローラー:

create: function(req, res) {
        var saveImage = function() {
            console.log(req.body);
            var possible = 'abcdefghijklmnopqrstuvwxyz0123456789',
                imgUrl = '';

            for(var i=0; i < 6; i+=1) {
                imgUrl += possible.charAt(Math.floor(Math.random() * possible.length));
            }

            var tempPath = req.files.file.path, //<line 55 error
                ext = path.extname(req.files.file.name).toLowerCase(),
                targetPath = path.resolve('./public/upload/' + imgUrl + ext);

            if (ext === '.png' || ext === '.jpg' || ext === '.jpeg' || ext === '.gif') {


                fs.rename(tempPath, targetPath, function(err) {
                    if (err) throw err;

                    res.redirect('/images/' + imgUrl);
                });
            } else {
                fs.unlink(tempPath, function () {
                    if (err) throw err;

                    res.json(500, {error: 'Only image files are allowed.'});
                });
            }
        };

        saveImage();
    },

ただし、画像をアップロードしようとすると、次のエラーが発生します。

TypeError: Cannot read property 'file' of undefined
    at saveImage (/home/pc/node-dev/test-proj/controllers/image.js:55:37)
    at module.exports.create (/home/pc/node-dev/test-proj/controllers/image.js:76:9)
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/pc/node-dev/test-proj/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/pc/node-dev/test-proj/node_modules/express/lib/router/layer.js:95:5)
    at /home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:330:12)
    at next (/home/pc/node-dev/test-proj/node_modules/express/lib/router/index.js:271:10)
    at urlencodedParser (/home/pc/node-dev/test-proj/node_modules/body-parser/lib/types/urlencoded.js:95:37)

そして、reqオブジェクトをログに記録すると、fileがありません。

{ title: 'myimage', description: 'something' }

実際、スニペットは私が読んだものを少し変更したバージョンです この本 、古いexpress-3を使用しています。つまり、基本的にはmulterの部分で更新しました。

ここで何が悪いのか、どうやって修正するのか疑問に思っています。

7
qliq

upload.single を使用しています。これは、req.fileではなくreq.filesを使用する必要があります。複数のファイルをアップロードするには、 upload.array を使用します。

.fileの後に別のreq.fileは必要ないことに注意してください。 req.fileは、upload.singleを使用している場合にアップロードされるファイルです。

12
maowtm