nodejs multer实现文件上传与下载


Posted in NodeJs onMay 10, 2017

本文实例为大家分享了nodejs实现文件上传下载的具体代码,供大家参考,具体内容如下

1.介绍

做了一个关于文件上传和下载的demo ,选择了Multer 作为中间件进行数据处理。

关于multer请参考中文翻译文档 https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md 或者官方文档

2. upload 文件上传

html form标签内设置enctype=”multipart/form-data”是必须的,这样才可以上传文件,方式为post ,在服务端使用multer时,基本与官网相同,引用中间件multer,app.post(‘\upload',upload.single(‘name'),function(){}); 指定单文件上传,参数是html的input里面的name ,这样就可以上传成功,但是问题是multer不会管你的后缀,上传到upload文件夹的文件有一个乱序名称但是没有后缀,所以我增加了这个功能。

req.file是文件信息,取得原名称,经过数组以及堆栈等处理得到后缀'.jpg' , 用fs.renameSync()方法重命名文件,加上本来的后缀。这样真正的上传成功。唯一的缺点是没有实现改变文件名字,使用官网方式出现了错误,所以没有深究。。

3.download 文件下载

网上基本上是express对res.download的封装以及fs方法为主,注意要把文件夹设定为静态文件。出现的问题是点击之后就会在新页面显示要下载的文件,无论是图片还是音乐。。这让我很困扰,但是找了很久也没有很好的解决。用IE访问结果是会出现下载还是查看的选项。。很迷。总之就是这样了,一晚上的努力,我很满足。。嘻嘻

服务端

//index.js

var fs = require('fs')
var express = require('express')
var multer = require('multer')
const path = require('path');

 var app = express();
 var upload = multer({dest:'upload/'});

//多文件上传 (限定上传文件个数)(没有修改后缀)
app.post('/upload-multi',upload.array('myfile',2),function(req,res,next){
  res.send("2 done");
})
//单文件上传获取信息
app.post('/upload-single',upload.single('myfile'),function(req,res,next){
  var file=req.file;
  // console.log("名称:%s",file.originalname);
  // console.log("mime:%s",file.mimetype);
//以下代码得到文件后缀
  name=file.originalname;
  nameArray=name.split('');
  var nameMime=[];
  l=nameArray.pop();
  nameMime.unshift(l);
  while(nameArray.length!=0&&l!='.'){
  l=nameArray.pop();
  nameMime.unshift(l);
  }
//Mime是文件的后缀
  Mime=nameMime.join('');
  console.log(Mime);
  res.send("done");
//重命名文件 加上文件后缀
  fs.renameSync('./upload/'+file.filename,'./upload/'+file.filename+Mime);

})

//文件下载尝试(chrome会直接在页面上展示。.最后也没有解决)
//设置download文件夹为静态 才能下载
 app.use('/download', express.static(path.join(__dirname, 'download')));
// app.get('/download',function(req,res){
//   var path='./download/aa.mp3';
//   res.download(path,'aa.mp3');
// });
app.get('/download', function(req, res){
 var file = __dirname + '/download/aa.mp3';
 res.download(file); 
});
app.get('/',function(req,res,next){
  res.sendFile(__dirname+"/index.html");
})

app.listen(3000);

客户端

//index.html

<!DOCTYPE html>
<html>
<head>
  <title>上传文件</title>
  <meta charset="utf-8">
</head>
<body>
<form enctype="multipart/form-data" action="/upload-single" method="post">
<input type="file" name="myfile"></input>
<input type="submit" value="提交"></input>
</form>

<form enctype="multipart/form-data" action="/upload-multi" method="post">
<input type="file" name="myfile"></input>
<input type="file" name="myfile"></input>
<input type="submit" value="提交"></input>
</form>
<a href="download/aa.mp3" rel="external nofollow" >下载文件</a>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
Nodejs让异步变成同步的方法
Mar 02 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 NodeJs
nodejs处理图片的中间件node-images详解
May 08 #NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 #NodeJs
win系统下nodejs环境安装配置
May 04 #NodeJs
Nodejs--post的公式详解
Apr 29 #NodeJs
NodeJs的fs读写删除移动监听
Apr 28 #NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 #NodeJs
NodeJs模拟登陆正方教务
Apr 28 #NodeJs
You might like
php写的AES加密解密类分享
2014/06/20 PHP
laravel model 两表联查示例
2019/10/24 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
JS实现li标签的删除
2019/04/12 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
python的id()函数解密过程
2012/12/25 Python
Python算法应用实战之队列详解
2017/02/04 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
为什么是 Python -m
2020/06/19 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
小学国庆节活动方案
2014/02/11 职场文书
美术毕业生求职信
2014/02/25 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
勤俭节约倡议书
2014/04/14 职场文书
员工离职感谢信
2015/01/22 职场文书
民政局未婚证明
2015/06/15 职场文书
python中subplot大小的设置步骤
2021/06/28 Python
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android