express 使用 multer 做文件上传时自定义文件名和存储路径

本文介绍了如何在Express中使用multer模块进行文件上传,并着重讲解了如何自定义存储路径和文件名。multer的官方文档推荐使用最新版本,中文文档可能已过时。通过示例代码展示了基本的单文件上传流程以及如何避免丢失文件后缀的问题。在指定存储路径时,若使用函数则路径需已存在,而字符串形式则multer会尝试创建路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简洁

multer 更新到1.x之后无法直接通过 app.use(multer()); 这样的方式去使用。

multer 的 文档地址:

中文文档的翻译也是2016年10月的,不建议看中文文档。

安装:

yarn add multer

引入:

const multer = require('multer');

二、基本使用 - 上传单文件

上面已经引入了 expressbody-parsermulterpath

const app = express();
const upload = multer({dest:path.join(__dirname,'./public/uploads')});

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

app.use('/',express.static('views'));

app.post('/',upload.single('file'),(req,res)=>{
  res.send(req.file);
});

HTML页面:

1.jpg

文件上传后,信息会存储在 req.file,主要信息是下面:

2.jpg

三、diskStorage 指定存储路径和文件名

上面上传单文件的方法简答粗暴,并且有很大的问题,不能保存文件后缀(可以看上面的文件path,没有后缀)

const app = express();
const storage = multer.diskStorage({
  // destination:'public/uploads/'+new Date().getFullYear() + (new Date().getMonth()+1) + new Date().getDate(),
  destination(req,res,cb){
    cb(null,'public/uploads/'+new Date().getFullYear() + (new Date().getMonth()+1) + new Date().getDate());
  },
  filename(req,file,cb){
    const filenameArr = file.originalname.split('.');
    cb(null,Date.now() + '-' + filenameArr[filenameArr.length-1]);
  }
});
const upload = multer({storage});

app.use(bodyParser.urlencoded({extended:true}));

app.use('/index',express.static('./views/index.html'));

app.post('/',upload.single('file'),(req,res)=>{
  console.log(req.body);
  console.log(req.file);
  res.send(req.file);
});

上面的关键方法就是:

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 })
  • destination 如果是一个函数,则下面的路径必须是已经存在的路径,否则汇报错误:路径不存在

比如下面的报错:Error: ENOENT: no such file or directory, open 'E:\Aprojects\node_projects\nodejs\20180504\demo3\public\uploads\201854\1525428354038-jpg

  • destination 如果是一个字符串,则路径不需要必须存在,只要能够创建路径就OK
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值