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的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
Nodejs关于gzip/deflate压缩详解
Mar 04 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
图解NodeJS实现登录注册功能
Sep 16 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的网址
2006/11/25 PHP
php array_unique之后json_encode需要注意
2011/01/02 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
JS定时关闭窗口的实例
2013/05/22 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
python斐波那契数列的计算方法
2018/09/27 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
python计算auc的方法
2020/09/09 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
铭万公司.net面试题笔试题
2014/07/20 面试题
考试作弊检讨书大全
2014/02/18 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
个人委托书如何写
2014/09/25 职场文书
个人典型事迹材料
2014/12/30 职场文书
董事长秘书工作总结
2015/08/14 职场文书
党员干部学习心得体会
2016/01/23 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
浅析Python实现DFA算法
2021/06/26 Python
MySQL常见优化方案汇总
2022/01/18 MySQL
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android