2017-01-15 4 views
0

私はNodeJSプロジェクトでmultipart/form-dataを使用しています。これにより、ユーザーはMP3をアップロードして設定を行うことができます。multerでファイルをアップロードする前にボディを取得するには?

私はうまく動作するマルチタミドルウェアを使用することに決めました。 https://github.com/expressjs/multer

index.ejs

<form method="post" action="/acp" role="publish" enctype="multipart/form-data"> 
    <div class="form-group"> 
     <input type="file" name="song" id="song" accept="audio/mpeg"> 
    </div> 

    <input type="checkbox" name="gender" checked data-toggle="toggle" data-on="Male" data-off="Female"> 
</form> 

app.js

var uploadSong = upload.single('song'); 
app.post('/acp', isLoggedIn, function (req, res) { 

    console.log(req.body.gender); // returns "undefined" 

    if(req.body.gender == 0) { // returns "undefined" 

     uploadSong(req, res, function (err) { 
      if (err) { 
       res.send('uploaded'); 
       return; 
      } 
      res.redirect('/'); 

     }); 

    } 
}); 

問題req.body.gender戻り常に未定義、私は内側にそれを使用する必要があるためuploadSongリスナー。

性別がゼロのときに曲をアップロードします。

答えて

1

(A)マルターでは不可能です。

(B)busboyを使用してください。ストリームを使用してフォームデータを解析するので、ファイルのアップロード前にフォーム要素の値を取得し、フィールドをイベントとして使用できるようにします。

(C)別の解決策(multerの使用を希望する場合)は、multerを使用するが、ファイルをアップロードする前にチェックするパラメータの値を送信するヘッダーを追加することです。要求がサーバーに到達するとすぐにヘッダーを使用できます。

+0

回答ありがとうございます。私はバスボイをしましたが、それは表現のために動作しないようです。その後、私はconnect-busboyを見ましたが、アップロードされたファイルをディレクトリに移動する方法はわかりません。投稿を編集して私に例を示すことができますか? – enucar

0

これは私のサンプルコードです、それは細かいウォーキングです、あなたが詳細な説明が必要な場合は教えてください。役に立ったら嬉しいです。

var Hotel = require('../models/hotel'); 
    var path = require('path'); 
    var multer = require('multer'); 
    var uplodedImages = []; 

    var storageHotelGallery = multer.diskStorage({ 
     destination: function (req, file, cb) { 
     cb(null, './uploads/hotelGallery'); 
     }, 
     filename: function (req, file, cb) { 
     console.log(req.body); 
     var newFileName = Date.now() + path.extname(file.originalname); 
     req.newFileName = newFileName; 
     cb(null, newFileName); 
     uplodedImages.push(newFileName); 
     } 
    }); 
    var uploadHotelGallery = multer({ storage: storageHotelGallery}).fields([{ name: 'imgArr', maxCount: 8 }]); 

    module.exports = function(router) { 
     // ADD HOTEL BASIC DATA TO CREATE HOTEL OBJECT 
     router.post('/createHotelStep1', function(req, res) { 
      if(req.body.name == null || req.body.name == '') { 
       res.json({ success: false, message: "Hotel name required" }); 
       res.end(); 
      } 
      else if(req.body.addressline1 == null || req.body.addressline1 == '') { 
       res.json({ success: false, message: "Address line 1 is required" }); 
       res.end(); 
      } 
      else if(req.body.city == null || req.body.city == '') { 
       res.json({ success: false, message: "City is required" }); 
       res.end(); 
      } 
      else { 
       var hotel = new Hotel(); 
       hotel.name = req.body.name; 
       hotel.addressline1 = req.body.addressline1; 
       hotel.addressline2 = req.body.addressline2; 
       hotel.phone = req.body.phone; 
       hotel.city = req.body.city; 
       hotel.email = req.body.email; 
       hotel.save(function(err) { 
        if (err) { 
         res.json({ success: false, message: "Unable to Complete Hotel Step 1" }); 
        } else { 
         res.json({ success: true, message: 'Create Hotel Step 1 Complete', _id : hotel._id }); 
        } 
       }); 
      } 
     }); 

     router.post('/createHotelGallery', function (req, res, next) { 
      uplodedImages = []; 
      uploadHotelGallery(req, res, function(err) { 
       if(err) { 
        res.json({ success: false, message: 'Could not upload images'}); 
        res.end(); 
       } 
       else { 
        Hotel.findOne({ _id:req.body._id }).populate('users').exec(function (err, hotel) { 
        if (err) { 
         res.json({ success: false, message: 'Could not save uploaded images to database'}); 
         res.end(); 
        } 
        else { 
         for(var x=0; x<uplodedImages.length; x++) 
          hotel.images.push(uplodedImages[x]); 
         hotel.save(); 
         res.json({ success: true, message: 'Gallery image uploaded' }); 
         res.end(); 
        } 
        }); 
       } 
      }); 
     }); 

     return router; 
    } 
関連する問題