nodeJs文件上传
2023-09-11 14:22:30 时间
一、multer中间件
再上传文件时,我们通常会使用到他。Multer用于处理multipart/form-data 类型的表单数据。首先我们先安装它:
cnpm install multer --save
二、使用
首先在form表单中我们需要设置enctype为:multipart/form-data表单类型。同时我们也需要用到fs模块对文件重命名。下面是单文件上传实例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<!--上传文件的情景下,应该使用enctype="multipart/form-data" -->
<form action="http://localhost:8080/" method="post" enctype="multipart/form-data">
<input type="file" name="files" value="指定文件">
<br><br>
<input type="submit" value="上传">
</form>
</body>
</html>
NODE代码:
const express=require("express");
const multer=require('multer');
const fs=require('fs');
//初始化上传对象,配置上传对象,设置上传的目录
var upload=multer({dest:'./upload/'});
var app=express();
//如果上传单个文件,可调用upload.single()
//upload.single("files")中的字符串为form表单的name属性值
app.use("/",upload.single("files"),function(req,res){ //files为input type="file"的name值
//req.file中的信息可看下文列出
console.log(req.file)
//上传后的文件没有后缀名,导入fs模块更改后缀名
var oldFile=req.file.destination+"/"+req.file.filename; //指定旧文件
//指定新文件
var newFile=+req.file.destination+"/"+req.file.filename + req.file.originalname;
//重命名
fs.rename(oldFile,newFile,function(err){
if(err){
res.send('上传失败!');
}else{
res.send('上传成功!');
}
});
});
app.listen(8080);
在这里我们可以指定单个文件上传到根目录的upload文件夹里。这里值得注意的是req.file会返回文件的基本信息如下:
fieldname: 'imgfile', //input type="file"的name值
originalname: 'img.jpeg' //用户计算机上的文件的名称
encoding: '7bit' //文件编码
mimetype: 'image/jpeg' //文件的 MIME 类型
destination: './public/upload' //保存路径
filename: 'dbafkjheue83hg9887432jhdgf' //保存在 destination 中的文件名
path: 'upload\\dbafkjheue83hg9887432jhdgf' //已上传文件的完整路径
size: 225473 //文件大小(字节单位)
三、上传多个文件
在HTML找中input type="file"需要加上multiple来实现过滤,multiple不写参数则可以读取·所有文件。而在服务端上,我们需要将single()改为array(“name”,num);的形式来接收多个文件的上传请求。最后对他们全部进行重命名。在这之前我们首先看看multer支持哪些文件上传方式:
.single(fieldname) //接受一个以 fieldname 命名的文件。.fields(fields)
.array(fieldname[, maxCount]) //接受一个以 fieldname 命名的文件数组。可以配置 maxCount 来限制上传的最大数量。
.fields(fields) //接受指定 fields 的混合文件。fields是一个拥有name和maxCount的数组对象。
.none() //只接受文本域。如果任何文件上传到这个模式,将发生 "LIMIT_UNEXPECTED_FILE" 错误。
.any() //接受一切上传的文件。
下面我们将会演示如何上传多个文件:
html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://localhost:8080/" method="post" enctype="multipart/form-data">
<input type="file" name="files" value="指定文件" multiple>
<br><br>
<input type="submit" value="上传">
</form>
</body>
</html>
node代码:
const express=require("express");
const multer=require('multer');
var upload=multer({dest:'./upload/'});
var fs = require('fs');
var app=express();
app.use("/",upload.array("files",5),function(req,res,next){
req.files.forEach(function(ele,index){
console.log(ele);
var oldFile=ele.destination+ele.filename; //指定旧文件
var newFile=ele.destination+ele.originalname; //指定新文件
fs.rename(oldFile,newFile,function(err){
err?console.log('上传失败!'):console.log('上传成功!');
});
});
res.send("成功上传");
});
app.listen(8080);
这里,我们获取文件信息是通过req.files来获取,他是由数组构成的对象,之后用foreach循环对其进行重命名即可。
四、通过limits来限制上传文件
Multer通过使用limits这个对象来对数据进行限制,它允许使用以下参数:
Key Description Default
fieldNameSize field 名字最大长度 100 bytes
fieldSize field 值的最大长度 1MB
fields 非文件 field 的最大数量 无限
fileSize 在 multipart 表单中,文件最大长度 (字节单位) 无限
files 在 multipart 表单中,文件最大数量 无限
parts 在 multipart 表单中,part 传输的最大数量(fields + files) 无限
headerPairs 在 multipart 表单中,键值对最大组数 2000
如果你上传的文件超出这些设定,MulterError模块将会启用,该模块在node_modules/multer/lib/multer-error.js上:
我们可以使用err.code定位到该错误,他有7种code方式,不同设置会返回不同code;
LIMIT_PART_COUNT
LIMIT_FILE_SIZE
LIMIT_FILE_COUNT
LIMIT_FIELD_KEY
LIMIT_FIELD_VALUE
LIMIT_FIELD_COUNT
LIMIT_FIELD_COUNT
下面就给大家做个简单实例:
html依然不变,js代码如下:
const express=require("express");
const multer=require('multer');
var upload=multer({dest:'./upload/',limits:{fileSize: 1024 * 1024 * 20,files: 5}});
var fs = require('fs');
var app=express();
app.use("/",upload.array("files",5),function(req,res,next){
req.files.forEach(function(ele,index){
var oldFile=ele.destination+ele.filename; //指定旧文件
var newFile=ele.destination+ele.originalname; //指定新文件
fs.rename(oldFile,newFile,function(err){
err?console.log('上传失败!'):console.log('上传成功!');
});
});
next();
res.send("上传成功!");
});
app.use(function(err,req,res,next){
if (err.code==='LIMIT_FILE_SIZE'){
res.send('File is too large');
}else if(err.code==='LIMIT_FILE_COUNT'){
res.send('Too many files');
}
})
app.listen(8080);
相关文章
- 浅谈Nodejs应用的主文件index.js的组成部分
- 利用angular4和nodejs-express构建一个简单的网站(一)——构建前后端开发环境
- nodejs 显示进度条插件
- nodejs获取文件扩展名
- nodejs及前端合并多个ArrayBuffer
- 电脑上安装了多个版本的nodejs,如何知道node命令调用的哪一个
- 使用nodejs应用查询SAP HANA Express Edition里的数据
- 用nodejs xml2js读取xml文件
- 使用nodejs创建Marketing Cloud的contact数据
- 关于nodejs的__dirname
- ERR! code EEXIST npm ERR! path D:softhtmlnodejsnpm.cmd npm ERR! Refusing
- NodeJs——(16)用Nodejs 4.X版本,制作一个微博网站(多图,详细步骤)
- 【nodejs原理&源码赏析(5)】net模块与通讯的实现
- nodejs 文件拷贝
- nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
- 理解互联网域名请求实现过程,以及Nodejs的http请求小谈