JS中FormData类实现文件上传


Posted in Javascript onMarch 27, 2020

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

上篇文章讲到了FormReader类实现文件上传,但是那是HTML5的新特性,在不支持H5的浏览器上则无法使用。这次介绍一个JS的普通类FormData,在不支持H5浏览器环境下也可以文件上传和预览,并且还能监控上传进度。

案例一:xhr.upload.onprogress监控文件的上传进度,并且动态显示

JS中FormData类实现文件上传

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
 .progress {
 width: 100px;
 height: 10px;
 background-color: #eee;
 }
 .progress-bar {
 width: 0;
 height: 10px;
 background-color: blue;
 }
 </style>
</head>
<body>
 <form action="" id="form">
 <input type="file" name="file" id="file">
 </form>
 <div class="progress">
 <div class="progress-bar" id="bar"></div>
 </div>
 <script>
 var file = document.getElementById("file");
 var bar = document.getElementById("bar");
 file.onchange = function () {
 var formData = new FormData();
 // 上传的文件
 formData.append('attrName', this.files[0]);

 var xhr = new XMLHttpRequest();
 xhr.open("post", "/upload");
 // xhr.upload.onprogress监听上传进度
 xhr.upload.onprogress = function (ev) {
 // ev.loaded表示上传了多少,ev.total表示文件的总大小
 var result = (ev.loaded / ev.total * 100).toFixed(2) + '%';
 // result为进度百分比
 bar.style.width = result;
 bar.innerHTML = result;
 }
 xhr.send(formData);
 xhr.onload = function () {
 if(xhr.status == 200) {
  console.log(xhr.responseText);
 }
 }
 }
 </script>
</body>
</html>

案例二:服务器端返回上传路径,供客户端预览上传的图片效果

成功预览我家耶啵的帅照

JS中FormData类实现文件上传

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
 .progress {
 display: inline-block;
 width: 600px;
 height: 20px;
 border-radius: 5px;
 background-color: #eee;
 }
 .progress-bar {
 width: 0;
 height: 20px;
 background-color: orange;
 border-radius: 5px;
 font-size: 16px;
 text-align: center;
 color: #fff;
 }
 </style>
</head>
<body>
 <form action="" id="form">
 <input type="file" name="file" id="file">
 <div class="progress">
 <div class="progress-bar" id="bar"></div>
 </div>
 </form>
 
 <div id="box"></div>
 <script>
 var file = document.getElementById("file");
 var bar = document.getElementById("bar");
 var box = document.getElementById("box");
 file.onchange = function () {
 var formData = new FormData();
 // 上传的文件
 formData.append('attrName', this.files[0]);

 var xhr = new XMLHttpRequest();
 xhr.open("post", "/upload");
 xhr.upload.onprogress = function (ev) {
 // ev.loaded表示上传了多少,ev.total表示文件的总大小
 var result = (ev.loaded / ev.total * 100).toFixed(2) + '%';
 // result为进度百分比
 bar.style.width = result;
 bar.innerHTML = result;
 }
 xhr.send(formData);
 xhr.onload = function () {
 if(xhr.status == 200) {
  var result = JSON.parse(xhr.responseText);
  var img = document.createElement('img');
  img.src = result.path;
  // 图片加载完成在进行显示,否则用户会看到图片的加载过程,效果不好
  img.onload = function () {
  box.appendChild(img);
  }
 }
 }
 }
 </script>
</body>
</html>

nodejs服务器端的部分代码:

app.post('/upload', (req, res) => {
 // 创建formidable表单解析对象
 const form = new formidable.IncomingForm();
 // 上传文件的路径
 form.uploadDir = path.join(__dirname, 'public', 'uploads');
 // 上传文件的后缀名保留
 form.keepExtensions = true;
 // 解析客户端传递过来的FormData对象
 form.parse(req, (err, fileds, files) => {
 // 将文件的地址扒出来以json对象的形式返回给客户端
 res.send({
 path: files.attrName.path.split('public')[1]
 });
 })
})

更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。

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

Javascript 相关文章推荐
JS获取scrollHeight问题想到的标准问题
May 27 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
Aug 07 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
javascript弹性运动效果简单实现方法
Jan 08 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
Jun 17 Javascript
Angular ng-animate和ng-cookies用法详解
Apr 18 Javascript
小程序中this.setData的使用和注意事项
Aug 28 Javascript
js实现上下左右键盘控制div移动
Jan 16 Javascript
JQuery复选框全选效果如何实现
May 08 jQuery
jquery实现拖拽添加元素功能
Dec 01 jQuery
JS中FileReader类实现文件上传及时预览功能
Mar 27 #Javascript
js、jquery实现列表模糊搜索功能过程解析
Mar 27 #jQuery
开发Node CLI构建微信小程序脚手架的示例
Mar 27 #Javascript
微信小程序间使用navigator跳转传值问题实例分析
Mar 27 #Javascript
vue跳转页面的几种方法(推荐)
Mar 26 #Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 #Javascript
JavaScript定时器使用方法详解
Mar 26 #Javascript
You might like
php下MYSQL limit的优化
2008/01/10 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
详解node中创建服务进程
2017/05/09 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python中的asyncio代码详解
2019/06/10 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python中return的返回和执行实例
2019/12/24 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
大学生毕业的自我鉴定
2013/11/13 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
民事起诉书范本
2015/05/19 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers