Node.js 使用express/multer时更改文件名

Node.js 使用express/multer时更改文件名,node.js,express,multer,Node.js,Express,Multer,我上传pdf时遇到问题(我使用的是ng file upload),到达express.js的文件json是: { fieldname: 'file', originalname: 'db.pdf', encoding: '7bit', mimetype: 'application/pdf', destination: './client/public/docs/transactions/', filename: '8a3fe7cb7369d9cffa8e17b162ec3d6

我上传pdf时遇到问题(我使用的是
ng file upload
),到达express.js的文件json是:

{ 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发送到express的属性,以下是所有设置:

html元素:

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

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!' } );

}

在express中这样配置

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

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

基本上,浏览器需要先发送数据,然后再发送文件。。。更好的解释可以在这里找到:

角度没有问题。Multer在文件上传时不存储扩展名。请检查此项:使用Ricardomura在上述链接中给出的答案来完成您的任务我想要的文件名是从客户端发送的,那么如何在diskStorage的文件名功能中获取它?并确保您的上传目录没有类似的文件名上传,否则您可能会覆盖现有文件。不,我不需要原始名称,我要将名称设置为:
filename:vm.code
查看
uploadPdf
函数,而此代码可能会回答问题,提供关于解决问题的方式和/或原因的附加上下文将提高答案的长期价值。如果我有多个文件,multer是否迭代所有文件并将文件名更改为原始名称?如果省略
destination
,文件将保存到
/var/folders/p5/
。它仍然在服务器上,还是在最终用户的机器上?
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 });
    Upload
        .upload( {
            url: '/upload',
            data: {
                new_file_name: vm.new_name, //this is the filename I want
                file: vm.pdf
            }
        } )
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!' } );

}