实现多文件拖拽上传的简易Node项目,可以在github上下载,你可以先下载下来:https://github.com/Johnharvy/upLoadFiles/。

解开下载下的zip格式包,建议用webstom 运行该项目,通过app.js启动项目,如果提示找不到node.exe执行环境,请指定好你的node.exe安装位置。这里我用的express框架是3.21.2版本。

我们来简单介绍下拖拽效果是怎么实现的。

这里先看代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><script src="js/jquery.js"></script><script src="js/EventUtil.js"></script><title>uploadFile</title><style>#a1{width:100px;height:100px;background: #aaaaaa;text-align:center;line-height:100px;color:rgba(81, 49, 202, 0.72);margin:150px auto;}</style>
</head>
<body>
<div id="a1">拖拽到此</div>
<div id="out-input"></div>
<script>var a1=document.getElementById("a1");function handleEvent(event){var info ="",output= document.getElementById("out-input"),files,i,len;EventUtil.preventDefault(event); //阻止事件的默认行为var formData =new FormData();if(event.type == "drop"){files=event.dataTransfer.files;i = 0;len= files.length;while( i< len){info += files[i].name +"("+ files[i].type + "," +files[i].size +"bytes)<br/>";formData.append("file"+i,files[i]);i++;}output.innerHTML = info;$.ajax({type:"post",url:"/uploadFile",data:formData,async: false,cache: false,contentType: false,processData: false,  //此处指定对上传数据不做默认的读取字符串的操作success:function(rs){console.log(rs);},error:function(r){alert("文件上传出错!");}});}}EventUtil.addHandler(a1, "dragenter", handleEvent);EventUtil.addHandler(a1, "dragover", handleEvent);EventUtil.addHandler(a1, "drop", handleEvent);
</script>
</body>
</html>

html内容很简单,一个显示允许的拖拽范围,一个用来显示上传文件内容的div块。

Js部分:

这里我准备了一个EventUtil接口对象,你也可以把它看成处理事件的很小的库,它的作用是封装了各个浏览器绑定相同事件的不同方法,为了实现各浏览器通用的事件绑定方法,统一用EventUtil对象来实现,你可以简单看下它的实现代码,非常简单。

当浏览器检测到拖拽的三种事件情况,“dragenter”,“dragover”,“drag"默认的行为会被阻止,当为”drag“情况时执行我们的自定义事件。

因为我们上传的是文件,所以这里用到了FormData的实例,通过append()添加文件到该对象中成为队列文件,上传到服务器端后会按队列顺序被解析成属性对象。事件中通过”event.dataTransfer.files“来获取事件中存储的文件。

这里还有一点需要注意的是jquery的ajax方法在上传文件对象时需要配置processData为false,意指不使用默认的读取字符串的操作。原因是默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,需要设置为 false

文件上传成功后控制台会打印”{infor:"success”}“信息。

到此,前端部分结束,下面我们来看Node.js端的代码。

文件结构如下:

我们先看路由——app.js里的内容:

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');var app = express();// all environments
app.set('port', process.env.PORT || 3000);
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname)));exports.app=app;
var uploadAction=require("./Action/fileUpload");
//路由事件监听uploadAction.uploadTest.uploadFile();
//文件上传监听// development only
if ('development' == app.get('env')) {app.use(express.errorHandler());
}app.get('/users', user.list);http.createServer(app).listen(app.get('port'), function(){console.log('Express server listening on port ' + app.get('port'));
});

和初始的app.js有几点不同,我把app对象导出来以便在fileUpload.js中重复利用,然后引入了fileUpload.js模块,并通过该接口对象获得保存该模块所有方法的uploadTest对象并调用uploadFile方法。

好,最后我们来看fileUpload.js文件:

var multipart = require('connect-multiparty');
var App=require("../app");
var path = require('path');
var fs=require("fs");
var app=App.app;var uploadTest={};function uploadFile(){app.post("/uploadFile", multipart(),function(req,res) {var i=0;while(i != null){if(req.files["file"+i]) upLoad(i);else{ i= null; res.json({infor:"success"});return;}i++;}//上传队列文件function upLoad(index){var filename = req.files["file"+index].originalFilename || path.basename(req.files["file"+index].path);//path接口可以指定文件的路径和文件名称,"\结尾默认为路径,字符串结尾默认为文件名"var targetPath = path.dirname("") + '/public/uploadFiles/' + filename;//fs创建指定路径的文件并将读取到的文件内容写入fs.createReadStream(req.files["file"+index].path).pipe(fs.createWriteStream(targetPath));}});
}uploadTest.uploadFile=uploadFile;exports.uploadTest=uploadTest;

nodeJs总是非常简便威猛的,而且具有高度的可创性,这也是我喜欢它的理由。我们看到这里的关键代码其实很少,我简单介绍下实现文件上传的逻辑过程:

  • 获取上传文件的文件名
  • 设置文件的存储位置,以及文件名称
  • 读取文件的内容流并创建新文件写入内容流

为了实现上传多个文件,我还做了一些匹配操作,很直观,不难理解。

文件上传成功后,会出现在public文件下的uploadFiles文件下。

文件中所用到的模块都记录在package.json中,可以通过进入package.json的同级目录地址通过指令”npm install“安装。如果是直接运行github上下载的工程文件,就不用再安装了。

如果你有任何问题,可以给我留言,我会及时回答。

转载于:https://www.cnblogs.com/zhu-xingyu/p/5707372.html

Html5+NodeJS——拖拽多个文件上传到服务器相关推荐

  1. 《大胖 • 小课》- 拖拽和剪贴板文件上传

    这是<大胖小课>栏目的专题一<说说文件上传那些事儿>的第5节-<实现文件拖拽和剪贴板上传> 专题已经更新章节: 拖拽上传 html5的出现,让拖拽上传交互成为可能, ...

  2. 拖拽或点击上传(支持苹果safari浏览器)

    <input type="file" value="上传">  拖拽或点击上传(在safari浏览器不支持拖拽),主要解决safari浏览器的拖拽问 ...

  3. 为什么文件上传不了服务器上,文件上传存在服务器还是数据库

    文件上传存在服务器还是数据库 内容精选 换一换 本章介绍如何在管理控制台购买GaussDB(for openGauss)实例,并通过内网使用弹性云服务器连接GaussDB(for openGauss) ...

  4. 文件上传打满服务器带宽,文件上传云服务器 带宽选择

    文件上传云服务器 带宽选择 内容精选 换一换 弹性云服务器支持通过内网访问OBS,OBS可供用户存储任意类型的数据.将图片.视频等数据存储至OBS后,在ECS上可以访问OBS,下载桶中的图片或视频等数 ...

  5. 文件上传linux服务器,Linux 文件上传Linux服务器

    进入命令行 在图形化桌面出现之前,与Unix系统进行交互的唯一方式就是借助由shell所提供的文本命令行界面(command line interface,CLI).CLI只能接受文本输入,也只能显示 ...

  6. 文档上传到服务器上,将文件上传到服务器上

    将文件上传到服务器上 内容精选 换一换 为了实现NAT Server.SAP HANA主备节点和SAP S/4HANA主备节点互相通过SSH协议跳转的功能,需要配置云服务器之间的互信.在本地PC上,生 ...

  7. html网页上传到服务器_JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao.service.servlet 这 ...

  8. asp.net ftp上传文件到服务器,.net 文件上传到服务器上

    详解 Linux 下 SSH 远程文件传输命令 scp 3.将本地文件上传到服务器上 scp-P 2222/home/lnmp0.4.tar.gz root@www.vpser.net:/root/l ...

  9. 上传文件到服务器地址怎么配置,文件上传到服务器怎么配置

    文件上传到服务器怎么配置 内容精选 换一换 模型准备以昇腾模型压缩工具的安装用户将需要量化的TensorFlow模型上传到Linux服务器任意目录下.本章节以sample自带的yolov3/pre_m ...

最新文章

  1. 2022-2028年中国安防行业研究及前瞻分析报告
  2. SAP CRM HANA report filter的工作原理
  3. android task详解,Android AsyncTask的使用详解
  4. Crossing River(信息学奥赛一本通-T1232)
  5. C语言:要求输入一个字符,如果这个字符是小写字母,将这个字母转换成大写字母,否则保持不变
  6. optuna 自动化调参利器
  7. 微信飞机大战游戏开发
  8. 工控领域国际品牌的市场兼并
  9. wpa_supplicant 使用
  10. 财报出炉,阿里大涨的背后 —— 凤凰终将涅槃?
  11. 利用计算机网络实现OA的功能,中小企业oa办公系统解决方案怎么做?
  12. 麻省理工学院公开课:经典力学
  13. webgis中的比例尺实现
  14. 招聘渠道超全汇总,最适合你的是哪一类?
  15. UI设计师高效切图6大步骤
  16. bootstrap-select下拉选项数据超长换行显示
  17. js处理json数组
  18. pandas的loc[ ]和iloc[ ]方法解析
  19. Hyper-v创建虚拟交换机与主机通信 ping通
  20. 探测器反向偏压_光电子技术题库

热门文章

  1. shell 编程中的判断
  2. Python开发规范
  3. 2-字符串能否构成三角形及何种三角形
  4. html整体移动,html 可以拖动多个div
  5. 著名NFT藏家WhaleShark的NBA Top Shot账户估值达1580万美元
  6. 福建首个区块链赋能教育信息化项目上线
  7. 美元指数DXY短线走高10逾点,现报90.77
  8. web元件库、axure元件库、通用元件库、常用web组件、常用表单、框架、数据表单、导航栏、边框、图标、列表、日期时间选择器、评分组件、穿梭框、输入框、步骤条、图表组件、数据可视化、后台模板、时间轴
  9. 基于Pandas的数据清洗
  10. 原型设计(顶会热词统计)