2017-10-28 2 views
3

アップローダに問題があります。私はコードを持つすべてが正しいと思うし、ファイルはまだアップロードフォルダに作成されていません。また、私はconsole.log(req.files)しようとすると、空の配列を取得します。Express multer upload doesnt work

const express = require("express"), 
     app = express(), 
     multer = require("multer"), 
     bodyParser=require("body-parser"), 


app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
     callback(null, './uploads/'); 
    }, 
    filename: function (req, file, callback) { 
     callback(null, file.fieldname + '-' + Date.now() + '.' + mime.extension(file.mimetype)); 
    } 
}); 

var upload = multer({ storage : storage }).array('userPic'); 

app.post("/postFormAct", isLoggedIn, function(req, res){ 
    upload(req,res,function(err) { 
     console.log(req.files); 
    }); 
}); 

はまた、私のフォームがあります:私はそれがローカル ここでは、コードであることを確認してみてください

<form method="post" action="/postFormAct" enctype="multipart/form-data"> 
    <input type="text" name="user"><br> 
    <input type="text" name="email"><br> 
    <input type="file" name="userPic"><br> 
    <input type="submit" value="Submit"> 
</form> 
+0

コードが欠落していないと仮定していますが、欠落している依存関係の 'mime'と' isLoggedIn'を追加すると、あなたのコードは動作します。エラーがないことを確認するために 'err'を記録しようとしましたか? 'destination'と' filename'関数にログインして、それらが呼び出されているかどうかを確認しようとしましたか?ファイルシステムのアクセス権の問題ですか?相対パスの代わりに絶対パスを使用しようとしましたか? – skirtle

+0

私はロギングを試みましたが、エラーはありません。私はすべてのソリューションを試し、空の配列または未定義のreq.filesが得られるたびにフォームに何か問題があります – rafalos

+0

フォームはかなり良いですが、別の '
'を実行してください。コードには何も問題はありません。私はあなたのコードを実行し、私のために働いています。テスト目的のためだけにisLoggedInを削除し、コードを実行してください。 –

答えて

2

私は、あなたが、あなたの関数レベルのミドルウェアとの問題を持っているあなたはisLoggedInを持って、あなたが持っていると思いますチェーンへのmulterミドルウェアupload右のようなので、後:

// ... 
var upload = multer({ storage : storage }).array('userPic'); 

app.post("/postFormAct", isLoggedIn, upload, function(req, res){ 
    console.log(req.files) 
}); 

ここで完全に動作するexempleです:

const app = require('express')() 
const bodyParser = require('body-parser') 
const multer = require('multer') 
const morgan = require('morgan') 

const storage = multer.diskStorage({ 
    destination: (req, file, cb) => { 
     cb(null, 'uploads') 
    }, 
    filename: (req, file, cb) => { 
     cb(null, file.fieldname + '-' + Date.now()) 
    } 
}) 

const upload = multer({ 
    storage: storage 
}) 

app.use(bodyParser.urlencoded({ extended: false })) 
app.use(bodyParser.json()) 
app.use(morgan('dev')) 

isLoggedIn = (req, res, next) => { 
    console.log('check if user is logged in') 
    next() 
} 

app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => { 
    console.log(req.files); 
    return res.send(req.files); 
}) 

app.listen(8000,() => { 
    console.log(`server is listenning on port 8000`) 
}) 

あなたは、テストリポジトリhere

はまた、あなたの先のディレクトリが存在することを確認してください見つけることができます。

+0

私は、動作例とこのコードでもアップロードフォルダにイメージを置くことはできません。また、ログreq.filesをコンソールにしようとすると、まだ空の配列 – rafalos

+0

私のコードを更新し、 GitHubの例 – Sapher

+0

ok問題は、他のモジュールが作業からのマルチタをブロックしていたことでした。今はその固定。助けてくれてありがとう – rafalos

1

代わりvar upload = multer({ storage : storage }).array('userPic'); 使用の

var upload = multer({ storage : storage }).any('userPic');

.ANY()

は、ワイヤの上に来て、すべてのファイルを受け入れます。ファイルの配列はreq.filesに格納されます。

+0

それを試してもまだ空の配列を取得 – rafalos