前言:
Express默认并不处理HTTP请求体中的数据,对于普通请求体(JSON、二进制、字符串)数据,可以使用body-parser中间件。而文件上传(multipart/form-data请求),可以基于请求流处理,也可以使用formidable模块或Multer中间件。
Multer中间件:
Multer是Express官方推出的,用于Node.jsmultipart/form-data请求数据处理的中间件。
它基于busboy构建,可以高效的处理文件上传,但并不处理multipart/form-data之外的用户请求。
使用:
Multer在解析完请求体后,会向Request对象中添加一个body对象和一个file或files对象(上传多个文件时使用files对象 )。其中,body对象中包含所提交表单中的文本字段(如果有),而file(或files)对象中包含通过表单上传的文件。
方法:
引用multer模块后,我们会获取到一个顶级方法。该方法是一个工厂函数,可以使用这个方法创建Multer对象。它接受一个选项对象,最基本的选项是dest,它告诉 Multer 文件的存储位置。如果忽略该选项,文件会被保存在内存中,并且永远不会写入硬盘中。
multer解析完上传文件后,会被保存为一个包含以下字段的对象:
fieldname - 表单提交的文件名(input控件的name属性)
originalname - 文件在用户设备中的原始名称
encoding - 文件的编码类型
mimetype - 文件的Mime类型
size - 文件的大小
destination - 文件的保存目录(DiskStorage)
filename - 文件在destination中的名称(DiskStorage)
path - 上传文件的全路径(DiskStorage)
buffer - 文件对象的Buffer(MemoryStorage)
{ fieldname: 'f1',
originalname: '小清新.png',
encoding: '7bit',
mimetype: 'image/png',
destination: './www/upload/',
filename: 'd52f74d801ddfca60d14e4c2cf5050cc',
path: 'www/upload/d52f74d801ddfca60d14e4c2cf5050cc',
size: 123309 }
.any()
- 接收所有文件
接收请求中的所有文件。上传文件数组会被保存在req.files中。
更多关于multer对象中的方法请参见https://www.jb51.net/article/95488.htm
代码示例:
const express=require('express');
const bodyParser=require('body-parser');
const multer=require('multer');
const fs=require('fs');
const pathLib=require('path');
var objMulter=multer({dest: './www/upload/'});
var server=express();
server.use(objMulter.any());
server.post('/', function (req, res){
//新文件名
//newName = 'www/upload/d52f74d801ddfca60d14e4c2cf5050cc' + '.png'
var newName=req.files[0].path+pathLib.parse(req.files[0].originalname).ext;
fs.rename(req.files[0].path, newName, function (err){
if(err)
res.send('上传失败');
else
res.send('成功');
});
//1.获取原始文件扩展名
//2.重命名临时文件
});
server.listen(8080);