使用express / multer时更改文件名

我上传PDF时遇到了麻烦,当我上传(我使用ng-file-upload )的文件json达到express.js是:

 { fieldname: 'file', originalname: 'db.pdf', encoding: '7bit', mimetype: 'application/pdf', destination: './client/public/docs/transactions/', filename: '8a3fe7cb7369d9cffa8e17b162ec3d6b', path: 'client\\public\\docs\\transactions\\8a3fe7cb7369d9cffa8e17b162ec3d6b', size: 9179145 } 

我想将名称更改为从angular度发送的属性,以下是所有设置:

html元素:

 <div ngf-select="vm.uploadPdf($file, $errFiles)" ngf-pattern="'.pdf'" accept="application/pdf" ngf-max-size="20MB">Select ... </div> 

angular func uploadPdf (ctrl为vm):

 function uploadPdf( file, errFiles ) { vm.pdf = file; vm.errorFile = errFiles && errFiles[ 0 ]; if ( vm.pdf ) { Upload .upload( { url: '/upload', data: { file: vm.pdf, new_file_name: vm.new_name//this is the filename I want } } ) .then( function ( response ) { $timeout( function () { vm.pdf.result = response.data; } ); }, function ( response ) { if ( response.status > 0 ) { vm.errorQuedanPdfUpload = response.status + ': ' + response.data; console.log( vm.errorQuedanPdfUpload ); } } ); } } 

performance:

 var express = require( 'express' ), router = express.Router(), util = require( 'util' ), multer = require( 'multer' ); var storage = multer.diskStorage( { destination: './uploads/', filename: function ( req, file, cb ) { //req.body is empty... //How could I get the new_file_name property sent from client here? cb( null, file.originalname ); } } ); var upload = multer( { storage: storage } ); router.route( '/upload' ) .post( upload.single( 'file' ), post ); function post( request, response ) { response.json( { message: 'Files Uploaded!' } ); } 

 var express = require( 'express' ), router = express.Router(), util = require( 'util' ), multer = require( 'multer' ); var storage = multer.diskStorage( { destination: './uploads/', filename: function ( req, file, cb ) { //req.body is empty... //How could I get the new_file_name property sent from client here? cb( null, file.originalname+ '-' + Date.now()+".pdf"); } } ); var upload = multer( { storage: storage } ); router.route( '/upload' ) .post( upload.single( 'file' ), post ); function post( request, response ) { response.json( { message: 'Files Uploaded!' } ); } 
 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 }); 

在你的expression中这样configuration

在Angular中,您需要将new_file_name移动到数据上方的文件中,如下所示:

  Upload .upload( { url: '/upload', data: { new_file_name: vm.new_name, //this is the filename I want file: vm.pdf } } ) 

基本上浏览器需要在文件之前发送数据…更好的解释可以在这里find: https : //github.com/expressjs/multer/issues/134