2016-02-19 205 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其他地方有什么错? –