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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
js滚动条回到顶部的代码
Dec 06 Javascript
javascript中使用正则计算中文长度的例子
Apr 29 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
微信小程序 购物车简单实例
Oct 24 Javascript
Vue中使用的EventBus有生命周期
Jul 12 Javascript
php中and 和 &amp;&amp;出坑指南
Jul 13 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
Aug 08 jQuery
精读《Vue3.0 Function API》
May 20 Javascript
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
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python解析html开发库pyquery使用方法
2014/02/07 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
python中模块查找的原理与方法详解
2017/08/11 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python 实现A*算法的示例代码
2018/08/13 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python批量创建指定名称的文件夹
2019/03/21 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
公司活动策划方案
2014/01/13 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js