Multer没有添加文件扩展名
问题描述:
我正在研究基于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文件得到这个?我在互联网上搜索并尝试使用各种方法来添加文件扩展名,但没有任何工作。
答
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
}
}
这将文件只保存到磁盘上,如果用户输入了正确的密码。
感谢您的帮助,但再一次,不工作...这是我在日志文件中得到的:{fieldname:'image_avatar', originalname:'Tuka_Icono-02.png', encoding:' 7位 ' MIME类型: '图像/ PNG', 目的地:' ./uploads', 文件名: 'bcebdd2d2b44256872177047259d0100', 路径: '上传/ bcebdd2d2b44256872177047259d0100', 大小:22538} –
我想你可以推断出扩展从MIME类型,然后使用https://www.npmjs.com/package/mime-types。我已经更新了我的答案。 –
这不起作用。再次我的日志文件:文件名:'29704301c5375e3f0c3ac139c6993df5',也许在我的app.js其他地方有什么错? –