使用Multer重命名上传的文件不起作用(Express.js)

我正尝试使用Express.js和Multer从HTML表单上传文件。 我设法将文件保存到所需的位置(一个名为uploads的文件夹)。

不过,我想重新命名文件,同时上传它,因为默认情况下,Multer给它一个奇怪的名字,如:

5257ee6b035926ca99923297c224a1bb

可能是一个hex时间戳,但我需要一个更明确的名字,以便稍后调用脚本。

我按照这里find的解释,但它没有做任何比以前更多的事情:上传带有hexa名称的文件。

此外,两个事件onFileUploadStartonFileUploadComplete似乎从来没有被触发,因为我没有得到任何logging在我的控制台。

我为服务器和路由使用了两个单独的文件:

app.js

/** * Dependencies */ var express = require('express'); var path = require('path'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); /** * Importation of routes */ var routes = require('./routes/index'); var recog = require('./routes/recog'); /** * Express */ var app = express(); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // pour contrer les erreurs de cross domain app.use(function (req, res, next) { // Website you wish to allow to connect res.setHeader('Access-Control-Allow-Origin', '*'); // Request methods you wish to allow res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); // Request headers you wish to allow res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // Set to true if you need the website to include cookies in the requests sent // to the API (eg in case you use sessions) res.setHeader('Access-Control-Allow-Credentials', true); // Pass to next layer of middleware next(); }); /** * Routes */ app.use('/', routes); app.use('/recog', recog); module.exports = app; 

recog.js

 /** * Requirements */ var express = require('express'); var router = express.Router(); var multer = require('multer'); var uploads = multer({ dest: 'uploads/', rename: function (fieldname, filename) { console.log("Rename..."); return filename + Date.now(); }, onFileUploadStart: function () { console.log("Upload is starting..."); }, onFileUploadComplete: function () { console.log("File uploaded"); } }); /** * Upload d'une image */ router.post('/upload', uploads.single('image'), function (req, res, next) { console.log("Front-end is calling"); res.json({status: 'success', data: 'Fichier chargé.\nOrgane sélectionné : ' + req.body.organ}); }); module.exports = router; 

我一直在挖,但我无法弄清楚是什么问题,因为我对Node.js和JavaScript一般都很陌生。

谢谢你们的帮助!

Multer的用法已经改变。

目前Multer的构造函数只接受三个选项:

  1. DIST /存储
  2. 的FileFilter
  3. 范围

现在重命名,onFileUploadStart,onFileUploadComplete将无法正常工作。

不过重命名可以使用DiskStorage完成

 var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now()) } }) var upload = multer({ storage: storage }) 

看看这些链接:

在date的帮助下给出一个随机的文件名,并且在file.mimetype帮助下附加原始的文件扩展名

尝试console.log(file.mimetype)你将得到的文件名和扩展名分隔“/”,然后我把它拆分为数组并从中获取扩展名。 尝试下面的代码。

 let storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads') }, filename: function (req, file, cb) { let extArray = file.mimetype.split("/"); let extension = extArray[extArray.length - 1]; cb(null, file.fieldname + '-' + Date.now()+ '.' +extension) } }) const upload = multer({ storage: storage }) 

就我个人而言,我实现了以下解决scheme,它为文件生成一个随机名称并追加原始文件扩展名(我假设我的扩展名在最后一个)。

 var path = require('path'); var options = multer.diskStorage({ destination : 'uploads/' , filename: function (req, file, cb) { cb(null, (Math.random().toString(36)+'00000000000000000').slice(2, 10) + Date.now() + path.extname(file.originalname)); } }); var upload= multer({ storage: options }); router.post('/cards', upload.fields([{ name: 'file1', maxCount: 1 }, { name: 'file2', maxCount: 1 }]), function(req, res, next) { /* handle files here req.files['file1']; //First File req.files['file2']; //Second File req.body.fieldNames;//Other Fields in the form */ }); 

MULTER文档中你会发现这个:

磁盘存储引擎使您可以完全控制将文件存储到磁盘。

有两个选项可用, 目的地文件名 。 它们都是决定文件存储位置的函数。

注意:在提供目的地作为function时,您负责创build目录。 传递一个string时,multer会确保为你创build目录。

文件名用于确定该文件夹内应该命名的文件。 如果没有给出文件名,每个文件将被赋予一个不包含任何文件扩展名的随机名称。

注意: Multer不会为你附加任何文件扩展名,你的函数应该返回一个文件扩展名。

我知道这个职位是过时的。 我想为可能迟到的人做出贡献。 下面是一个全function的服务器脚本来处理多个上传的图片与随机保存的图片名称和文件扩展名。

 var express = require("express"); var multer = require("multer"); var app = express(); var path = require("path"); var uuid = require("uuid"); // Allow cross origin resource sharing (CORS) within our application app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploadedimages/') }, filename: function (req, file, cb) { cb(null, uuid.v4() + path.extname(file.originalname)); } }) var upload = multer({ storage: storage }) // "files" should be the same name as what's coming from the field name on the client side. app.post("/upload", upload.array("files", 12), function(req, res) { res.send(req.files); console.log("files = ", req.files); }); var server = app.listen(3000, function() { console.log("Listening on port %s...", server.address().port); }); 

试试这个我正在使用的方式

  var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { console.log(file); var fileObj = { "image/png": ".png", "image/jpeg": ".jpeg", "image/jpg": ".jpg" }; if (fileObj[file.mimetype] == undefined) { cb(new Error("file format not valid")); } else { cb(null, file.fieldname + '-' + Date.now() + fileObj[file.mimetype]) } } }) var upload = multer({ storage: storage })