【问题标题】:Change filename when using express/multer使用 express/multer 时更改文件名
【发布时间】:2016-03-06 06:25:34
【问题描述】:

我在上传 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>

angular func uploadPdf (ctrl as 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 );
                    }
                }
            );
    }
}

快递:

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

}

【问题讨论】:

  • angular没有问题。 Multer 不会在文件上传时存储扩展名。
  • 使用上面链接中 ricardomoura 给出的答案来完成你的任务

标签: node.js express multer


【解决方案1】:
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!' } );

}

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
  • 如果我有多个文件,multer 是否会遍历所有文件并将文件名更改为原始名称?
  • 如果您忽略destination,文件将保存到/var/folders/p5/。它仍然在服务器上,还是在最终用户的机器上?
【解决方案2】:
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 });

在你的快递中这样配置

【讨论】:

  • 我要的文件名是客户端发过来的,那么如何在diskStorage的filename函数中获取呢?
  • 并确保您的上传目录,没有类似的文件名上传,否则您可能会覆盖现有文件。
  • 不,我不要原来的名字,我要设置名字为:filename: vm.code查看uploadPdffunc
【解决方案3】:

在 Angular 中,您需要将 new_file_name 移动到 data 中的 file 上方,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 2018-07-21
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2017-03-06
    • 2017-11-12
    相关资源
    最近更新 更多