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

作者 : 开心源码 本文共2633个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共227人阅读
  • 在ajax1.0时代, 是无法直接上传文件的, 到了ajax2.0时代, 新添加了FormData, 我们即可以用FormData完成文件的上传

  • 以前我们用form表单中的<input type="file"/>实现文件上传, 但前台无法实时查看上传的进度, 而ajax2.0可以让我们实时监控上传进度

  • 下面是一个原生js使用ajax 完成 FormData上传文件, 并实时监听文件上传进度的小Demo, 前后台均已完成代码实现(后台为nodejs实现)

GIF效果展现

前台实现代码:

<!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>
  • 后台实现代码
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/")});

Gif图中使用的小姐姐图片素材

  • 点我获取上图超清版

小结:

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

上一篇 目录 已是最后

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 原生js使用FormData上传文件并监听进度(附前后台实现源码)

发表回复