Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >原生js使用FormData上传文件并监听进度(附前后端实现源码)

原生js使用FormData上传文件并监听进度(附前后端实现源码)

作者头像
zhaoolee
发布于 2019-06-14 02:43:35
发布于 2019-06-14 02:43:35
4.3K00
代码可运行
举报
文章被收录于专栏:木子昭的博客木子昭的博客
运行总次数:0
代码可运行
  • 在ajax1.0时代, 是无法直接上传文件的, 到了ajax2.0时代, 新增了FormData, 我们就可以用FormData完成文件的上传
  • 以前我们用form表单中的<input type="file"/>实现文件上传, 但前端无法实时查看上传的进度, 而ajax2.0可以让我们实时监控上传进度
  • 下面是一个原生js使用ajax 完成 FormData上传文件, 并实时监听文件上传进度的小Demo, 前后端均已完成代码实现(后端为nodejs实现)

GIF效果展示

前端实现代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>原生ajax2.0使用FormData上传文件, 并监听上传进度</title>
</head>
<body>
    <div style="text-align: center; padding-top: 50px">
        <div style="font-size: 16px; color: #44A1F8;padding-bottom: 50px">原生ajax2.0使用FormData上传文件, 并监听上传进度</div>
        <input type="file" id="avatar" />
        <button onclick="to_upload_file()">上传</button>
        <br>
        <br>
        <div style="text-align: left;display: inline-block;width: 300px; height: 20px; border: 1px solid #44A1F8; border-radius: 2px;position: relative">
            <div id="progress_bar" style="display: inline-block; width: 0px; height: 20px;background-color: #64B587"></div>
            <div style="text-align: center;width: 300px;position: absolute; top: 0; font-size:16px; color: #413F43">
                <div id="loading">
                    上传进度0%
                </div>
            </div>
            
        </div>
    </div>
        <script>
            // 处理上传进度
            function progressFunction(e){
                var progress_bar = document.getElementById("progress_bar");
                var loading_dom = document.getElementById("loading");
                var loading = Math.round(e.loaded / e.total * 100);
                console.log("loading::", loading);

                if(loading === 100){
                    loading_dom.innerHTML = "上传成功^_^";
                }else{
                    loading_dom.innerHTML = "上传进度"+loading+"%"
                }
                
                progress_bar.style.width = String(loading * 3) + "px";
            }
            // 上传成功
            function uploadComplete(e) {
                console.log("上传成功!", e);
            }
            // 上传失败
            function uploadFailed(e) {
                console.log("上传失败", e);
            }
    
            function to_upload_file(){
                var file_obj = document.getElementById("avatar").files[0]
                if(file_obj){
                    var url = "/upload_file";
                    var form = new FormData();
                    form.append("file", file_obj);
                    var xhr = new XMLHttpRequest();
                    xhr.onload = uploadComplete; // 添加 上传成功后的回调函数
                    xhr.onerror =  uploadFailed; // 添加 上传失败后的回调函数
                    xhr.upload.onprogress = progressFunction; // 添加 监听函数
                    xhr.open("POST", url, true);
                    xhr.send(form);
                }else{
                    alert("请先选择文件后再上传")
                }
            }
        </script>
</body>
</html>
  • 后端实现代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const express = require("express");
const multer = require("multer");
const expressStatic = require("express-static");
const fs = require("fs");

let server = express();
let upload = multer({ dest: __dirname+'/uploads/' })
// 处理提交文件的post请求
server.post('/upload_file', upload.single('file'), function (req, res, next) {
  console.log("file信息", req.file);
  fs.rename(req.file.path, req.file.path+"."+req.file.mimetype.split("/").pop(), ()=>{
    res.send({status: 1000})
  })
})

// 处理静态目录
server.use(expressStatic(__dirname+"/www"))
// 监听服务
server.listen(8080, function(){
  console.log("请使用浏览器访问 http://localhost:8080/")
});

小结:

本文代码及相关素材已经托管到Github仓库, 永久下载地址https://github.com/zhaoolee/Blog/tree/master/form_data_upload_file

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SRC低危捡漏之短信轰炸
本文属于OneTS安全团队成员Asoul的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
4810
SRC低危捡漏之短信轰炸
国内外临时匿名邮箱及接收手机短信验证码网站
因为行业特殊,所以一直有各种相关需要,于是这些年从各个地方收集了一些国、内外免费临时接收邮箱及手机短信验证码的网站平台,数量比较多,抽时间进行了一些整理,在这里总结记录一下。
HACK学习
2019/08/05
155.7K2
国内外临时匿名邮箱及接收手机短信验证码网站
关于验证码的那些漏洞
手机号码前后加空格,86,086,0086,+86,0,00,/r,/n, 以及特殊符号等
黑战士
2022/10/06
3.3K0
用JAVA实现Email和短信验证
在Web项目中Email和短信验证是很普遍的情形,下面我们来介绍如何用Java来实现。
顾翔
2021/07/22
2.4K0
边缘ob,验证码攻击
今天带大家认识一下验证码的真面目,本文参考N10th大佬文章,不得不说思路就是广啊,我参考后直接找案例验证,废话不多说,直接上菜。
字节脉搏实验室
2020/11/06
2K0
边缘ob,验证码攻击
个人开发者短信验证码接入方案技术分析与实践
在开发个人项目时,短信验证码是用户注册、登录验证等场景的必需功能。然而,传统短信服务提供商大多要求企业资质,给个人开发者造成了技术实现上的困难。本文将从技术角度分析这一问题,并分享一些实用的解决方案。
外滩首席运维
2025/06/09
970
黑马瑞吉外卖之移动端验证码登录使用qq邮箱
pc端的后台管理我们剩下有订单明细还没有进行开发,由于订单这边需要移动端下单后才可以看到订单,所以我们需要去先在移动端开发一些功能后,再回过头让订单这边进行一个展示。
兰舟千帆
2022/10/04
1.5K0
黑马瑞吉外卖之移动端验证码登录使用qq邮箱
邮箱发送验证码和短信发送验证码的学习笔记
思路是 随机生成一个验证码code,然后存入redis,设置过期时间,然后发送给用户,用户填好后从前端再传回,此时将用户传的code跟redis中存入的code对比,相同true,否则false
全栈程序员站长
2022/11/04
4.4K0
邮箱发送验证码和短信发送验证码的学习笔记
渗透测试之攻破登录页面
登陆界面最直接的就是密码爆破,上面说的那些漏洞我也说了,很难遇到!而对于爆破最重要的不是用的哪个工具,而是字典好不好,这里用的bp!
故里[TRUE]
2023/04/19
2.2K0
渗透测试之攻破登录页面
邮箱验证
今天分享的这句话,是管理学教授彼得·德鲁克说过的一句名言,大意是『没有什么比有效地做那些根本不需要做的事更无效的了』让我们不要浪费时间在那些无用的事上。
小闫同学啊
2019/07/18
4.8K0
邮箱验证
注册模块上线前安全测试checklist
许多应用系统都有注册模块,正常用户通过注册功能,获得应用系统使用权限;而非法用户通过注册模块,则是为了达到不可告人的目的,非法用户可以通过注册模块与服务端进行交互(一切用户输入都不可信),因此系统上线前,有必要对注册模块进行重点测试。
FB客服
2020/02/24
1.2K0
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
用户输入手机号,点击发送按钮进行手机号提交,程序会校验手机号是否合法,不合法时要求用户重新输入手机号,合法则在后台生成对应的验证码并保存至session,之后通过短信方式将验证码发送给用户。
.29.
2023/11/29
1.1K0
①实现基于session的登录流程:发送验证码、登录注册、校验登陆状态
手把手带你在集成SpringSecurity的SpringBoot应用中添加短信验证码登录认证功能
在上一篇文章一文理清SpringSecurity中基于用于名密码的登录认证流程中笔者有详细地介绍了Spring Security登录认证的流程,也为我们在工作中面需要实现自定义的登录认证如手机号+短信验证码、邮箱地址+邮箱验证码以及第三方登录认证等方式的扩展做好了准备。那么本文,笔者就手把手带大家实现在集成了Spring Security的SpringBoot项目中如何增加一种手机号+短信验证码的方式实现登录认证。
用户3587585
2022/04/14
2.6K0
手把手带你在集成SpringSecurity的SpringBoot应用中添加短信验证码登录认证功能
发送短信验证码和邮箱验证码—Java实现
  短信验证码都是调用一些接口来进行短信的发送,短信验证码在登录、注册等操作中使用的最广泛,本文这一节演示如何使用Java制作一个简单的短信验证码登录。
端碗吹水
2020/09/23
8.5K0
发送短信验证码和邮箱验证码—Java实现
一次短信验证码整改实验
这个短信验证码在并发量非常大的情况下有可能会失效,后续会进行整改升级,保证线程安全
阿东
2021/08/16
1.1K0
JAVA实现利用第三方平台发送短信验证码
前段时间自己做的一个小项目中,涉及到用短信验证码登录、注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来。
用户7353950
2022/06/23
6.2K0
JAVA实现利用第三方平台发送短信验证码
金融行业平台常见安全漏洞与防御
一、前言 互联网金融是这两年来在金融界的新兴名词,也是互联网行业一个重要的分支,但互联网金融不是互联网和金融业的简单结合,而是在实现安全、移动等网络技术水平上,被用户熟悉接受后,适应新的需求而产生的新
FB客服
2018/02/05
2.9K0
金融行业平台常见安全漏洞与防御
基于 Session 短信验证码登录
基于 Session 短信验证码登录获取验证码正则工具类package com.hmdp.utils;public abstract class RegexPatterns { /** * 手机号正则 */ public static final String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$"; /** * 邮箱正则 */ publi
ruochen
2022/08/05
7.4K0
你的 Java 验证码和登录程序中可能也存在这样的漏洞
进行这个整理,是因为在XXX项目的时候,发现登录模块的忘记密码功能,在验证用户身份的时候是通过手机验证码验证的。通过修改响应包的返回参数值,可以绕过验证,进入第三步的密码重置。还有最近测试的一个sso登录,也存在验证码问题。
业余草
2020/02/11
2.4K0
日常划水:短信验证码开发实例
我一生的文章都会放在这里,我的博客,我希望每一行代码,每一段文字都能帮助你。 https://github.com/CrazyCodes...
猿哥
2019/07/10
8510
推荐阅读
相关推荐
SRC低危捡漏之短信轰炸
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验