node.js学习(15)——上传(multer)

上一节-node.js学习(14)—nodejs模板引擎ejs

上节我们学学习了模板引擎,本节我们学校文件上传。
目录结构如下:


20190530154855.png

1.上传(multer

我们在upload.html添加下面代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传demo</title>
</head>
<body>
    <form action="http://localhost:8080/infor" method="post" target="stop" enctype="multipart/form-data">
        <input type="value" name='account'>
        <input type="file" name='user'>
        <input type="submit" value="上传">
    </form>
    <!-- 阻止提交跳转页面 -->
    <iframe  name="stop" style="display:none;"></iframe> 

</body>
</html>

在server.js添加下面代码

const express=require('express');
const multer=require('multer');
// const bodyParser=require('body-parser');
const server=express();
// server.use(bodyParser.urlencoded())
var objMulter=multer({dest: './uploadImages'}); //设置上传的的图片保存目录
server.use(objMulter.any());

server.post('/infor',function(req,res,next){
    console.log(req.body,req.files)
    res.send({
        code:1,
        msg:'成功'
    })
})
server.listen(8080);
  1. 我们使用form提交数据时,如果需要提交的数据中含有图片、音视频等,需要给form添加enctype="multipart/form-data"属性,如果不加,默认以enctype="application/x-www-form-urlencoded"编码传输。如果需要详情了解该属性,可以网上搜索了解。具体体现在请求头的Content-Type上,比如
20190530155923.png
  1. 前面我们讲的body-parser组件只能处理enctype="application/x-www-form-urlencoded"编码的数据,并放到req.body中,所以如果含有图片等数据,需要借助中间件,这里使用multer中间件。
  2. multer({dest: './uploadImages'})表示将上传的图片传输到指定文件夹(这里以uploadImages为例,如果没有该文件夹,会自动生成),如果不添加dest属性,这些文件将保存在内存中,永远不会写入磁盘。
  3. objMulter.any()表示接收任何上传的数据,对应的有个objMulter.single('user')(表示只接收name为user的上传数据),本例使用objMulter.any()接收任何上传的数据。
  4. multer会将上传的文件信息写到req.file中,表单的文本域信息放到 req.body中(所以不需要再引入body-parser)

我们测试下如下:

222.gif

我已经将截图中打印的数据复制出来如下:

//req.body
{ account: 'eee' }

//req.files
[{
  fieldname: 'user', //表单的name属性值
  originalname: '五月排行榜.png', //上传的图片原始文件名(含后缀)
  encoding: '7bit', //文件编码
  mimetype: 'image/png', //上传图片格式(MIME 类型)
  destination: './www/uploadImages', //上传后的相对图片路径(不包含文件)
  filename: 'db5debb87b20a324a36b618f27441fca', //上传的图片新生成的文件名(不含后缀)
  path: 'www\\uploadImages\\db5debb87b20a324a36b618f27441fca', //上传后的完整图片路径(包含文件)
  size: 1182425 //上传图片大小
}]

至此,我们已经完成了一个简单的文件上传。但是上传的文件由于不包含文件后缀,所以无法预览,那么怎么才能给上传的图片添加后缀呢?在添加后缀前,我们先了解下path模块(获取后缀)与fs模块(重写文件名)

2.path模块

新建path.js文件,增加如下代码:

const path=require('path');
const file1='/home/user/dir/file.txt';
const str=path.parse(file1)
console.log(str)

运行path.js输出结果如下:

{ 
    root: '/',
    dir: '/home/user/dir',
    base: 'file.txt',
    ext: '.txt',
    name: 'file'
 }
  1. 通过path模版的parse方法,ext属性可以获取一个路径的后缀.

3.fs模块

新建a.txt文件以及rename.js,我们现在通过fs模块将a.txt重命名为b.txt,我们在rename.js增加下面代码

const fs=require('fs');
fs.rename('a.txt','b.txt',function(err){
    if(err){
        console.log('重命名错误');
    }else{
        console.log('重命名成功');
    }
})

执行代码,我们发现a.txt已经变为b.txt

init.gif

4.上传图片增加预览

上面我们讲到上传的文件由于不包含文件后缀,所以无法预览,现在我们通过path模块与fs模块来实现预览功能

更改server.js如下

const express=require('express');
const multer=require('multer');
const path=require('path');
const fs=require('fs');
// const bodyParser=require('body-parser');
const server=express();
// server.use(bodyParser.urlencoded())
var objMulter=multer({dest: './uploadImages'});
server.use(objMulter.any());

server.post('/infor',function(req,res,next){
    const newname=req.files[0].path+path.parse(req.files[0].originalname).ext
    fs.rename(req.files[0].path,newname,function(err){
        if(err){
            res.send('上传失败')
        }else{
            res.send('上传成功')
        }
    })
})
server.listen(8080);

上面的代码应该很容易看懂,获取后缀,重命名文件。测试如下

er.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容