文件上传,算是网页中屡见不鲜的功能。搞web开发的程序员没有不知道的。尽管如此,我也得拿出来说说,作为自己学习成果。
事物都是一个不断更新迭代的过程。目前,所做的仅仅在跟随巨人脚步。学习记录,但愿有助新人。:)
直接开干
用过node写程序的人,都知道node模块话开发,有时候动不动就是十来个依赖包导入。比如这个node程序,要用到的模块就有12个。当然文件上传仅需用到四个模块。不管怎么说,程序开始前,还是老老实实导包吧,这个过程是必须的。
文件上传实列需要用的模块有:
1. express
2. multer
3. path
4. fs
代码开始,导入三方模块
程序初始化。
node
const express = require('express'); //express http 框架
const fs = require('fs'); //
const multer = require('multer'); //处理multitype 格式的文件上传。
const objMulter = multer({dest:'.www/upload'}) //调用multer返回对象,指定上传文件保存位置。
const pathLib = require('path');
var server = express();
server.listen(80);
html
.........
<form action="http://localhost:80/" method = "post" enctype="multipart/form-data">
上传文件:<input type="file" name="pic">
上传:<input type="submit" value="上传">
</form>
............
后端初始化完成,接下来分析,为完成文件上传功能,我们需要做的有。
- 上传文件地址(上传文件保存地址)
- 接受文件(获取存放服务器端文件基本信息)
- ( post文件上传,前端我们需要设置表单上传数据类型)
暂时先是这样一个思路,其他文件类型,上传文件大小限制且不说。
前端设置form数据格式, enctype="multipart/form-data'
文件上传位置设置。
const multer = require('multer');
const objMulter = multer({dest:'.www/upload'});
对,初始化过程已经完成文件上传保存目录。
导入multer模块,调用并传入option, dest属性值用于指定存放路径。这里我们在项目根目录创建/www并创建子目录/upload用于存放上传文件。
获取接受文件
通过req.files中,获取上传文件信息。
server.use(objMulter.any()); //向express注册multer
server.use('/', (req, res) => {
//req.body普通表单数
//req.files正真的上传文件
//获取原始文件名
//path + 扩展名(上床文件扩展名)
var newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext;
fs.rename(req.files[0].path, newName, (err) => {
if(err){
// res.send('上传失败');
res.send(err)
}else{
res.send('success');
}
});
console.log(req.files)
});
req.files结果
为了防止上传的文件重名,服务端对计算机原始文件名进行了随机命名
可以看出上面文件信息,源文件是 test.html 上传过后,文件名是 path。还有一点,上传的文件是二进制内容,是无法获取文件内容的。
对此怎么办呢。记得fs系统模块有一个,rename的api,可以文件重命名。添加扩展名。这样就能打get文件内容
fs.rename(pramas1,prmas2,callback)
参数解读:
第一个是pramas1是原文件名,
pramas2新文件名。
callback异步回调
结果
可以看到,文件已经上传成功了。