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 相关文章推荐
JAVASCRIPT HashTable
Jan 22 Javascript
function foo的原型与prototype属性解惑
Nov 19 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
Nov 28 Javascript
JS执行删除前的判断代码
Feb 18 Javascript
JS实现两个大数(整数)相乘
Apr 28 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
Apr 05 Javascript
vue+axios实现登录拦截的实例代码
May 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中AES加密解密的例子小结
2014/02/18 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python pillow模块使用方法详解
2019/08/30 Python
Django框架模板用法入门教程
2019/11/04 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
生物制药毕业生自荐信
2013/10/16 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
校园文明标语
2014/06/13 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书