node应用通过multer模块实现文件上传
multer用于处理文件上传的nodejs中间件,主要跟express框架搭配使用,只支持表单MIME编码为multipart/form-data类型的数据请求.
如果要处理其他编码的表单数据可以通过busboy或者formidable。
multer模块的安装: npm install multer
构造multer对象: multer(opt)
opt是个key-value对象,包含属性dest/storage,fileFilter,limits.分表表示文件的存储位置/方式,文件过滤,文件大小限制.
例如:
//通过设置dest属性,表示上传文件的存储位置
let objmulter = multer({ dest: path.join(__dirname,'uploads')});
如果想对上传文件做更多的选项设置,比如文件名,存储类型等可以通过指定storagelet storage = multer.diskStorage({
//文件存储路径
destination: (req , file , cb )=>{
cb(null , path.join(__dirname , 'uploads'));
},
//修改上传文件的名字
//file 是个文件对象 ,fieldname对应在客户端的name属性
//存储的文件需要自己加上文件的后缀,multer并不会自动添加
//这里直接忽略文件的后缀.
filename: (req , file , cb ) => {
cb( null, file.fieldname +'-' + Date.now());
}
}); let objMulter = multer({storage : storage });
如果初始化multer时候没有指定dest或者storage,上传的文件将保存在内存中,永远不会写入到磁盘中,在storage中如果没有指定destination值,那么上传的文件将存储在系统默认的临时文件夹.
multer关联的文件信息:
filedname : 在form表单中指定的name属性值
orginalname : 原始文件名
encoding : 文件编码方式
mimetype : 多媒体类型
size : 文件大小,单位b
destination : 文件上传后存储在服务端的路径
filename : 文件在服务端的命名
path : 文件在服务端的完整路径
buffer : 文件二进制数据 ps:其中destination,filename和path只有在指定storage属性时候有效.而buffer只有文件在内存中存储时候有效.
multer同时提供了single/array/fields/any方法用于对接受文件数的控制.
1) single(fieldname) 接收单个文件,通过req.file访问该文件
2) array(fieldnaem,[maxcount]) 接收多个文件,通过req.files数组方法文件.maxcount指定接收文件最大数.
3) fields(fields) 接受指定fieldname的文件,fieldname由客户端决定,通过req.files数组方法
4) any 接收所有文件上传,通过req.files访问文件
ps:该实例基于nodejs v5.8,js部分使用到es6, web框架基于express,web模板esj-mate,所以你需要安装nodejs,同时通过npm install命令安装express,ejs-mate,multer模块.
1.app.js
"use strict"
const express = require('express');
const path = require('path');
const multer = require('multer');
let app = express();
let storage = multer.diskStorage({
//文件存储路径
destination: (req , file , cb )=>{
cb(null , path.join(__dirname , 'uploads'));
},
//修改上传文件的名字
//file 是个文件对象 ,fieldname对应在客户端的name属性
filename: (req , file , cb ) => {
cb( null, file.fieldname +'-' + Date.now());
}
});
let METHOD_MODE = { SINGLE:'single',ARRAY:'array' , ANY:"any"};
let isDest = false; //不是dest就是storage
let obj = null;
let multerobj = null;
if( isDest ){
multerobj = multer({
dest: path.join(__dirname,'uploads')
});
}else {
multerobj = multer({
storage: storage
});
};
//默认使用single方法,如果需要使用
//array和any和field等方法
//在index.html也需要做相应的修改
let mode = METHOD_MODE.SINGLE;
const FIELD_NAME = "_file";
let upload_multer ;
(function(){
switch( mode ){
case METHOD_MODE.SINGLE: upload_multer = multerobj.single(FIELD_NAME);break;
case METHOD_MODE.ARRAY: upload_multer = multerobj.array(FIELD_NAME);break;
case METHOD_MODE.ANY: upload_multer = multerobj.any();break;
default:
upload_multer = null; break;
}
})();
if(upload_multer == null ){
throw new Error("exception");
}
app.use('/public',express.static(path.join(__dirname , 'public')));
app.set('views',path.join(__dirname , "views"));
app.set('view engine','html');
app.engine('html',require('ejs-mate'));
app.get('/' , (req ,res) =>{
res.render('index',{title:'multer: File Upload Demo'});
});
let objMulter = multer({storage : storage });
app.post('/upload', (req, res ) => {
upload_multer( req, res , function( err ){
if( mode == METHOD_MODE.ARRAY || mode == METHOD_MODE.ANY){
console.log( "file length: " + req.files.length );
}else if(mode == METHOD_MODE.SINGLE){
console.log(JSON.stringify( req.file ));
}
if(err) return res.json({issuccessful: 0, message: err });
else
return res.json({issuccessful: 1, message: "File is uploaded "});
});
});
app.listen(3000,()=>{console.log("server is running...")});
2.index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title><%=title %> </title>
</head>
<body>
<div>
<form enctype="multipart/form-data" method="post" action="/upload">
File:<input type="file" id="_file" name="_file" style="width:400px;height:35px;"/>
<!-- 仅仅在使用multer。array时候 -->
<!-- <input type="file" id="_file1" name="_file" style="width:400px;height:35px;"/>
<input type="file" id="_file2" name="_file" style="width:400px;height:35px;"/> -->
<input type="submit" value="submit" style="width:100px;height:35px;" />
</form>
</div>
</body>
</html>
启动程序,打开cmd然后cd到工程目录,node app.js
node应用通过multer模块实现文件上传的更多相关文章
- 【node】---multer模块实现图片上传---【巷子】
1.安装muterl第三方模块 cnpm install multer --save 2.使用 multer在解析完成后,会向request对象中添加一个body对象和一个file或者files对象( ...
- node.js使用express框架进行文件上传
关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...
- Node.js新手教程——怎样实现文件上传功能
作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...
- 使用Node.js的Express框架进行文件上传
我们先创建一个Express项目,要使用文件上传的功能还需要下载multer模块. npm install --save multer 下面我们在public文件夹下创建upload.html,内容如 ...
- Node使用 Express框架,实现文件上传
一 安装依赖包 npm install multer --save 二 客户端上传文件 <!DOCTYPE html> <html> <head> <meta ...
- nodejs使用multiparty模块实现文件上传(另附express.bodyParser()的说明)
最近师弟师妹们在用formidable做文件上传的时候会出现form.parse()不会触发的问题,在stackoverflow也没有找到答案,反而是几个答案推荐使用multiparty来代替,因为那 ...
- 【nodejs】--express的中间件multer实现图片文件上传--【XUEBIG】
Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件.该中间件不处理multipart/form-data数据格式以外的任何形式的数据 Tips ...
- node.js系列(实例):原生node.js+formidable模块实现简单的文件上传
/** * 原生node.js结合formidable模块实现图片上传改名 * @Author:Ghost * @Date:2016/07/15 * @description: * 1.引入模块htt ...
- Node.js文件上传
Node.js express使用Multer实现文件上传html部分 <div> <h3>文件上传:</h3> 选择一个文件上传: <br/> < ...
随机推荐
- 《University Calculus》-chape10-向量与空间几何学-向量夹角
点积.向量夹角: 无论对于空间向量还是平面向量,我们所熟知的是:给出任意两个向量,我们都能够根据公式计算它们的夹角,但是这个夹角必须是将两个向量的起点重合后所夹成的小于等于π的角,可是,这是为什么呢? ...
- Live555 Streaming from a live source
https://www.mail-archive.com/live-devel@lists.live555.com/msg05506.html-----ask--------------------- ...
- poj 1287 Networking【最小生成树prime】
Networking Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7321 Accepted: 3977 Descri ...
- 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...
- C# 实现关闭按钮隐藏窗体而不退出
private void OpenNewMxdFrm_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; thi ...
- C#中HashTable的用法示例1
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- bzoj2132: 圈地计划
要分成两坨对吧.. 所以显然最小割 但是不兹辞啊.. 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来,减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 ...
- sql 视图 按where条件多个字段取一个 分类: SQL Server 2014-12-01 14:09 308人阅读 评论(0) 收藏
首先介绍一下 Case ..When...Then..End 的用法: CASEJiXiaoFind_RowID WHEN '1' THENJiXiao_Money1 WHEN '2' THEN ...
- ICSharpCode.SharpZipLib压缩解压
一.使用ICSharpCode.SharpZipLib.dll: 下载地址 http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.asp ...
- 使用SqlAlchemy时如何方便的取得dict数据、dumps成Json
使用Sqlalchemy可以方便的从数据库读取出python对象形式的数据(吐槽:说实话对象形式也没多方便,还不如我之前从关系型数据库直接读取出dict形式的数据用起来方便,具体参见我以前的文章htt ...