express + multer 文件上传入门

摘要:
如前所述,在web开发中,我们经常遇到图像上传的功能。接下来,我们使用express4.15.0框架中的multer1.3.0模块来实现图像上传。首先,我们使用express生成器express框架生成器来生成项目。这里我们使用ejs模板引擎(因为我只知道这一点)。创建express上传后,目录结构如下图所示:然后开始安装依赖项并运行cduploadscnpmins

写在前面的

在web开发中,我们经常会遇到图片上传的功能,接下来我们就在express4.15.0框架中利用multer1.3.0模块来实现图片上传

开始敲代码

首先利用express-generator express框架生成器生成我们的项目
这里我们采用ejs模板引擎(因为我只会这个)

express -e uploads

创建好之后,目录结构如下图所示:
express + multer 文件上传入门第1张
然后开始安装依赖并且运行

cd uploads
cnpm install
npm start

用谷歌浏览器打开http://localhost:3000,出现下图。至此,我们的express框架已经搭建完成
express + multer 文件上传入门第2张

接下来,安装multe中间件,并且将依赖写入package.json

cnpm install multer --save

打开package.json,我们惊奇的发现多了一行
express + multer 文件上传入门第3张

至此,我们终于搭建好环境了,正式开始编程

我们首先写一个表单提交路由

在routes文件下的index.js中,添加一个路由

router.get('/upload', function(req, res, next) {
  res.render('upload', { title: '图片上传' });
});

接下来写一个相对应的表单提交页面

注意!提交方式必须是post,同时添加属性enctype="multipart/form-data"
要不然,http协议的头信息是不对的,关于这点,可以参考这里

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='http://t.zoukankan.com/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <form action="doup" method="post" enctype="multipart/form-data">
    	<p>
    		<label for="img">图片上传:</label>
    		<input type="file" value="选择图片"   name="image">
    	</p>
    	<p>
    		<input type="submit" value="提交">
    	</p>
    </form>
  </body>
</html>

运行程序,结果如下图
express + multer 文件上传入门第4张

很幸运,程序正常运行

接下来,我们需要修改app.js,引入multer模块

var multer = require('multer');

在相应的位置上添加下面语句

//将上传上来的image文件放到项目的tmp文件夹下面
//!!!特别注意:这句话必须放在
//app.use('/', index);
//app.use('/users', users);
//这两句的前面,否则后面会失败的
app.use(multer({dest: './tmp/'}).array('image'));

运行程序之后,我们又可以惊奇的发现项目中多了一个文件夹
express + multer 文件上传入门第5张

在浏览器上传文件后,打开tmp文件夹,发现里面的多了一个文件,名字是一串乱七八糟的东西,
express + multer 文件上传入门第6张

很懊恼,这明明不是我上传的jpg图片呀

不要着急,这里我们把文件的名字改一下
名字随便写,后缀是你上传的后缀就可以,我上传的是jpg格式的图片,
很神奇的事情发生了
express + multer 文件上传入门第7张

我们发现这不就是我们上传的文件吗,可是难道我们必须手动更改吗
不要忘了nodejs很轻易就可以对本地文件进行操作
利用fs模块可以轻松实现这点

在routers中的index.js我们接着更改

引入fs模块

var fs = require('fs');

添加post提交路由

router.post('/doup', function (req,res,next){
	var files = req.files;
	var oldPath = files[0].destination + files[0].filename;
	var newPath = './public/uploads/' + files[0].originalname;
	console.log(newPath);
	fs.rename(oldPath, newPath, function (err) {
		if (err) {
			throw err;
		}
		res.send('success');
	});
})

运行程序,上传图片,发现图片正常上传
express + multer 文件上传入门第8张

express + multer 文件上传入门第9张

至此,我们的上传图片已经大功告成!

免责声明:文章转载自《express + multer 文件上传入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Gin框架系列03:换个姿势理解中间件Python Linux系统管理之查找文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jmeter上传图片附件实践

一、根据定义的接口文档,通过Jmeter发起请求 接口请求入参 { "consignorPrice": 299, "manageNo": "MMOUXX", "waybillNo": "100514000141", "driverPrice": 273, "cargoWeight": 29.09, "oil": 34, "loa...

spring boot + vue实现图片上传及展示

转载:https://blog.csdn.net/weixin_40337982/article/details/84031778 其中一部分对我很有帮助 转载记录下 首先,html页面: <!--form中是要加这个enctype的--> <form class="form-horizontal" enctype="...

移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象

前些时候遇到移动端需要上传图片和视频的问题,之前一直通过ajax异步的提交数据,所以在寻找通过ajax上传文件的方法。发现了H5里新增了一个FormData对象,通过这个对象可以直接绑定html中的form元素,然后通过ajax提交的时候直接提交这个对象就好了。 在移动端调用视频和音频: <input type="file"accept="image...

Jmeter(三) 从上传图片来入门Jmeter

用Jmeter上传用户头像到人人网 先用抓包工具Fiddler把上传操作的报文抓取下来 开启Jmeter,在测试计划中创建一个线程组,取名为“图片上传” 再在线程组中创建一个HTTP请求 在请求报文中可以看到有一个<file>的参数,其实就是图片名称。 在Jmeter的文件上传中把图片路径配置上去 配置上传参数,接口URL,请求方式...

web前端图片上传(2)

今天发现了一种ajax上传图片的方式,是以前没有用过的,首先来说下为什么要用这种方式。是因为原来后台是用的form表单的方式来提交表单数据的。但是觉得呢,这种方式不太好,因为要刷新页面,前台只用控制台看不到传输的参数(如果哪位大神知道怎么看到,请不吝赐教),所以我们就改成了ajax的方式,结果后台老哥说,前端改改就行了,后端不用改。然后我去找到了这种aja...

七牛云上传图片名添加前缀

先来说下自己遇到的问题吧。项目使用七牛云来存储用户头像,大致流程:客户端从后台获取到 uploadToken 和domain,然后客户端通过安卓SDk上传图片。 问题:为了给图片分类,现在需要把客户端上传的头像图片加一个前缀路径。 例如:之前上传完图片地址是 htt://domain.com/bob_head.jpg 归类后:http://domain.c...