2014-10-30 64 views

回答

1

我在express中使用busboy middleware來解析多部分/表單數據請求中的圖像,它的工作原理非常好。

我的代碼看起來是這樣的:

const busboy = require('connect-busboy'); 
//... 
app.use(busboy()); 

app.use(function parseUploadMW(req,res,next){ 
    req.busboy.on('file', function onFile(fieldname, file, filename, encoding, mimetype) { 
    file.fileRead = []; 
    file.on('data', function onData(chunk) { 
     this.fileRead.push(chunk); 
    }); 
    file.on('error', function onError(err) { 
     console.log('Error while buffering the stream: ', err); 
     //handle error 
    }); 
    file.on('end', function onEnd() { 
     var finalBuffer = Buffer.concat(this.fileRead); 
     req.files = req.files||{} 
     req.files[fieldname] = { 
     buffer: finalBuffer, 
     size: finalBuffer.length, 
     filename: filename, 
     mimetype: mimetype.toLowerCase() 
     }; 
    }); 
    }); 
    req.busboy.on('finish', function onFinish() { 
    next() 
    }); 
    req.pipe(req.busboy); 
}) 

然後文件將在您的明確路線在req.filesreq對象爲您服務。

此技術適用於小圖像。如果你正在做一些硬核上傳,你可能想考慮流文件(以節省內存)到他們的目的地 - 如s3或類似的 - which can also be achieved with busboy

另一種流行和體面的包是:https://github.com/andrewrk/node-multiparty

+0

謝謝,我會檢查一下 – 2014-10-31 20:30:17

2

即時通訊使用multer,它完美的作品。它在本地存儲你的圖像。如果你願意,你也可以把它發送給mongodb。這是我如何做到的。

var multer = require('multer'); 
var done = false; 

//define the model you are working with* 
var Slides = require('./models/work'); 

app.use(multer({ 
    dest: './public/img', 
    rename: function (fieldname, filename) { 
     return filename+Date.now(); 
    }, 

    onFileUploadStart: function (file) { 
     console.log(file.originalname + ' is starting ...') 
    }, 

    onFileUploadComplete: function (file) { 
     console.log(file.fieldname + ' uploaded to ' + file.path); 
     done = true; 
     var id= file.fieldname; 
     var str = file.path; 
     var image = str.replace('public', ''); 

     var slidegegevens = { 
      "id": id, 
      "img": image 
     }; 

     var s = new Slides(slidegegevens); 
     s.save(function (err, slidegegevens) { 
      console.log(err); 
      console.log('slidegegevens: ' + slidegegevens); 
     }); 
    } 
}));