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实现的抽象CSS圆角效果!!
May 03 Javascript
JQuery 遮罩层实现(mask)实现代码
Jan 09 Javascript
用jquery和json从后台获得数据集的代码
Nov 07 Javascript
jquery写个checkbox——类似邮箱全选功能
Mar 19 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
javascript实时显示北京时间的方法
Mar 12 Javascript
jQuery使用animate创建动画用法实例
Aug 07 Javascript
基于JavaScript实现简单的随机抽奖小程序
Jan 05 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
jQuery动态增减行的实例代码解析(推荐)
Dec 05 Javascript
微信小程序云开发之使用云数据库
May 17 Javascript
node.js事件轮询机制原理知识点
Dec 22 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
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
python抓取网页内容示例分享
2014/02/24 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
详解python调度框架APScheduler使用
2017/03/28 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
奥巴马就职演讲稿
2014/05/15 职场文书
银行求职信
2014/05/31 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
培训计划通知
2015/07/15 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python