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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx/Tengine通用配置教程
Nginx/Tengine通用配置教程,包含多域名共用一个端口指向不同程序、Nginx负载均衡配置、Https配置、禁止通过IP访问、设置访问流量并发速率、Nginx反代PHP、Nginx反代Tomcat。 Nginx通用配置: user www www; worker_processes auto; worker_cpu_affinity auto; dso { load ngx_http_concat_module.so; load ngx_http_sysguard_module.so; }
4xx.me
2022/06/09
9720
Nginx/Tengine通用配置教程
【随手记】Nginx配置详解
Nginx 是一个高性能的 HTTP 服务器和反向代理,它以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。Nginx主要用来处理HTTP请求,提供负载均衡、静态内容服务、反向代理等功能。
客怎眠qvq
2024/04/26
4.4K0
【随手记】Nginx配置详解
ThinkPHP3.2.3+Nginx的伪静态配置
一、配置nginx.conf user  www www; worker_processes auto; error_log  /www/wwwlogs/nginx_error.log  crit; pid        /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events     {         use epoll;         worker_connections 51200;         multi_a
Sindsun
2018/06/06
2.8K0
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:n
用户1177713
2018/02/24
23.4K0
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
nginx配置文件nginx.conf超详细讲解
#nginx进程,一般设置为和cpu核数一样 worker_processes 4;                         #错误日志存放目录 error_log  /data1/logs/error.log  crit;  #运行用户,默认即是nginx,可不设置 user nginx        #进程pid存放位置 pid        /application/nginx/nginx.pid;         #Specifies the value for maximum file descriptors that can be opened by this process. #最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果 worker_rlimit_nofile 51200;
互联网金融打杂
2019/01/24
2.1K0
Nginx软件优化
1.1 Nginx优化分类 安全优化(提升网站安全性配置) 性能优化(提升用户访问网站效率) 1.2 Nginx安全优化 1.2.1 隐藏nginx版本信息优化 官方配置参数说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 官方参数: Syntax: server_tokens on | off | build | string; Default: server_tokens on; Context: http
惨绿少年
2018/03/30
1.4K0
部署上线-部署Django项目
启动命令:python manage.py runserver 0.0.0.0:8000
星哥玩云
2022/09/14
1.7K0
部署上线-部署Django项目
2.Nginx进阶学习之最佳配置实践指南
描述:在企业线上生产环境中推荐进行Nginx编译安装,可以按照业务侧重点进行相应 Nginx 编译参数配置,所以编译参数不是功能加的越多越好,应该尽可能少编译模块不用的最好不要加入,本小结将以最新的Nginx版本以及依赖版本进行编译演示。
全栈工程师修炼指南
2022/09/29
2K0
2.Nginx进阶学习之最佳配置实践指南
nginx 总结
1. Nginx无法启动解决方法 在查看到logs中报了如下错误时: 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 是因为80端口出现了冲突 2. Weight 和ip_hash 在负载均衡均衡模块中upstream的 Weight是可以把请求的链接优先访问该服务 Ip_hash会去将客户端转发到一个可用的服务器上 如果服务器不可用需
小小科
2018/05/02
1.5K0
nginx 总结
高性能Web服务器Nginx使用指南
Nginx是一个高性能的http服务器和反向代理服务器,是一个高度模块化的web服务器,和Apache的模块化不同,Nginx的模块不支持动态编译,Nginx要加入新的第三方模块的时候,必须先下载模块,然后重新编译Nginx,而Apache只需要将新加入的模块编译成so文件,然后配置文件指定是否加载即可,无需重新编译Apache。并且Nginx的rewrite模块会使用正则表示式进行匹配,因此需要pcre软件库的支持,另外ssl加密需要openssl-devel软件库的支持,gzip压缩传输需要zlib-devel软件库的支持。编译安装Nginx之前确定这三个软件库已经安装。
星哥玩云
2022/07/14
2.2K0
高性能Web服务器Nginx使用指南
Nginx配置模块详解及多站点共用80端口案例
main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设置)
菲宇
2022/12/21
2.6K0
Nginx配置模块详解及多站点共用80端口案例
万字总结,体系化带你全面认识 Nginx !
作为一名开发人员,你是不是经常碰到领导让你上服务器去修改 Nginx 配置,然而你可能会对这些配置并不熟悉!今天就让我们一起告别这种尴尬,向“真正”的程序员迈进!!!
入门笔记
2022/06/02
7230
万字总结,体系化带你全面认识 Nginx !
3.Nginx配置进阶(三)
==============================================================================
py3study
2020/01/08
9740
3.Nginx配置进阶(三)
nginx应用总结(1)--基础认识和应用配置
在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结。 一、nginx服务简介 Nginx是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。 使用 Nginx 前必须了解的事项: 1)目前官方 Nginx 并不支持 Windows,您只能在包括 Linux、UNIX、BSD 系统下安装和使用; 2)Nginx
洗尽了浮华
2018/01/23
3.4K0
nginx应用总结(1)--基础认识和应用配置
通过 docker 高效学习 nginx 配置,并附全部配置文件
本篇文章以前端的视角,介绍下 nginx 的常见配置,并通过 docker 的方式学习 nginx,这保证所有示例配置都能正常运行。
山月
2022/11/02
1.8K0
通过 docker 高效学习 nginx 配置,并附全部配置文件
Docker 安装 Nginx 负载均衡配置
Docker 安装 # 1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 2)添加Docker软件包源(否则doker安装的不是新版本) yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 3)安装Docker CE yum install -y docker-ce # 4)启动Do
IT茂茂
2020/03/05
2.6K0
Docker 安装 Nginx 负载均衡配置
linux 安装配置Nginx
时光_赌徒
2024/11/13
3360
在Linux Nginx配置HTTPS
一、公钥和私钥的获取 可以购买,可以自己生成,本文假设你已经有了公钥和私钥。 公钥和私钥的文件,欢迎访问http://yimian.me体验我们的产品 二、把SSL证书中的公钥和私钥放到服务器中的Ng
黄小怪
2018/05/21
2.8K0
nginx 模块详解
worker_processes number | auto; worker进程的数量;通常应该为当前主机的cpu的物理核心数 worker_cpu_affinity auto [cpumask] #将work进程绑定在固定cpu上提高缓存命中率 例: worker_cpu_affinity 0001 0010 0100 1000; worker_cpu_affinity 0101 1010; worker_priority number 指定worker进程的nice值,设定worker进程优先级: [-20,20]    worker_rlimit_nofile number worker进程所能够打开的文件数量上限,默认较小,生产中需要调大如65535
星哥玩云
2022/07/26
1.9K0
nginx 模块详解
记录一个nginx的配置
rt #user xiaoju; worker_processes 32; #error_log logs/error.log notice; #error_log logs/error.log debug; #error_log logs/error.log info; #pid logs/nginx.pid; events { use epoll; worker_connections 512; } worker_rlimit_nofile 512;
用户1225216
2019/05/25
7960
相关推荐
Nginx/Tengine通用配置教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验