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 相关文章推荐
经常用到的JavasScript事件的翻译
Apr 09 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
Dec 29 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
使用jsonp完美解决跨域问题
Nov 27 Javascript
JS实现仿苹果底部任务栏菜单效果代码
Aug 28 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
Bootstrap Scrollspy源码学习
Mar 02 Javascript
使用JS模拟锚点跳转的实例
Feb 01 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
使用Vue实现图片上传的三种方式
Jul 17 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
JavaScript array常用方法代码实例详解
Sep 02 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/03/24 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
用Python进行简单图像识别(验证码)
2018/01/19 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
使用Django清空数据库并重新生成
2020/04/03 Python
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
Android面试宝典
2013/08/06 面试题
大学毕业生自荐书怎么写?
2014/01/06 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书