2016-02-19 227 views
0

我正在研究基於Node.js/MongoDB的網站,我試圖直接在服務器上使用Express,Jade和Multer上傳圖像,但無論我做什麼,我都可以'用擴展名上傳文件。Multer沒有添加文件擴展名

var express = require('express'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 
var multer = require('multer'); 

var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, './uploads') 
    }, 
    filename: function (req, file, cb) { 
     cb(null, file.originalname) 
    } 
}); 

var upload = multer({ storage: storage }); 


var app = express(); 

mongoose.connect("mongodb://localhost/primera_pagina"); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(multer({dest: "./uploads"}).single("image_avatar")); 


var productSchema = { 
    title:String, 
    description:String, 
    imageURL:String, 
    pricing:Number 
}; 

var Product = mongoose.model("Product", productSchema); 

app.set("view engine","jade"); 

app.use(express.static("public")); 

app.get("/",function(req,res){ 

    res.render("index"); 

}); 

app.post("/productos",function(req,res){ 
    if(req.body.password == "123"){ 
     var data = { 
      title: req.body.title, 
      description: req.body.description, 
      imageURL: "image_avatar", 
      pricing: req.body.pricing 
     } 

     var product = new Product(data); 

     console.log(req.file) 

    }else{ 
     res.render("index"); 
    } 


}); 

app.get("/productos/new",function(req,res){ 
    res.render("productos/new"); 
}); 


app.listen(8080); 

任何想法:

我已經在我的app.js文件得到這個?我在互聯網上搜索並嘗試使用各種方法來添加文件擴展名,但沒有任何工作。

回答

0

Multer爲了安全和碰撞原因剝去了文件擴展名。對於解決辦法,試試這個:

var path = require('path') 
var multer = require('multer') 
var mime = require('mime-types') 

var storage = multer.diskStorage({ 
    destination: './uploads/', 
    filename: function (req, file, cb) { 
    crypto.pseudoRandomBytes(16, function (err, raw) { 
     if (err) return cb(err) 

     cb(null, raw.toString('hex') + mime.extension(file.mimetype)) 
    }) 
    } 
}) 

var upload = multer({ storage: storage }) 

(從https://github.com/expressjs/multer/issues/170#issuecomment-123402678

它賦予一個隨機文件名,但保持在機智的文件擴展名。


你也應該使用在multer的授權領域,因爲它看起來像你只需要文件時,用戶有正確的密碼。做這樣的事情:

var upload = multer({ storage: storage }, limits : { fileFilter: authorize }); 

function authorize(req, file, cb) { 
    if (req.body.password == PASS) { 
     cb(null, true); //accept 
    } else { 
     cb(null, false); //reject 
    } 
} 

這將文件只保存到磁盤上,如果用戶輸入了正確的密碼。

+0

感謝您的幫助,但再一次,不工作...這是我在日誌文件中得到的:{fieldname:'image_avatar', originalname:'Tuka_Icono-02.png', encoding:' 7位 ' MIME類型: '圖像/ PNG', 目的地:' ./uploads', 文件名: 'bcebdd2d2b44256872177047259d0100', 路徑: '上傳/ bcebdd2d2b44256872177047259d0100', 大小:22538} –

+0

我想你可以推斷出擴展從MIME類型,然後使用https://www.npmjs.com/package/mime-types。我已經更新了我的答案。 –

+0

這不起作用。再次我的日誌文件:文件名:'29704301c5375e3f0c3ac139c6993df5',也許在我的app.js其他地方有什麼錯? –