Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >XMLHttpRequest2-FormData上传文件方法封装及进度条的实现

XMLHttpRequest2-FormData上传文件方法封装及进度条的实现

作者头像
空空云
发布于 2018-09-27 03:58:51
发布于 2018-09-27 03:58:51
1.2K00
代码可运行
举报
文章被收录于专栏:大前端_Web大前端_Web
运行总次数:0
代码可运行

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://cloud.tencent.com/developer/article/1347595

FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利,使用FormData的最大优点就是我们可以异步上传一个二进制文件,兼容性需要IE10+。

构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new FormData (form? : HTMLFormElement)

参数

form (可选)

一个HTML表单元素,可以包含任何形式的表单控件,包括文件输入框.

方法
  • append 给当前FormData对象添加一个键/值对.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void append(DOMString name, Blob value, optional DOMString filename);
void append(DOMString name, DOMString value);

如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");

formData.get("k1"); // "v1"
formData.getAll("k1"); // ["v1","v2","v1"]
  • get
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
formData.get("name"); // 获取key为name的第一个值
formData.getAll("name"); // 返回一个数组,获取key为name的所有值

-set

我们可以通过set(key, value)来设置修改数据,如果指定的key不存在则会新增一条,如果存在,则会修改对应的value值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
formData.append("k1", "v1");
formData.set("k1", "1");
formData.getAll("k1"); // ["1"]
  • has
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
formData.append("k1", "v1");
formData.append("k2",null);

formData.has("k1"); // true
formData.has("k2"); // true
formData.has("k3"); // false
  • delete
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
formData.append("k1", "v1");
formData.append("k1", "v2");
formData.append("k1", "v1");
formData.delete("k1");

formData.getAll("k1"); // []
  • entries 返回一个 iterator对象 ,此对象可以遍历访问FormData中的键值对。其中键值对的key是一个 USVString 对象;value是一个 USVString , 或者 Blob对象。

FormData上传文件方法的封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
;(function (window, document) {
    /**
     * @param selector : jquery selector
     * @param url : url of upload
     * @param file : object of file
     * @param beforeSend : function of validate
     * @param successF : function of success
     * @param errorF : function of error
     * @param uploadProgress : function of uploadProgress
     * @param otherRequestData : object of  otherRequestData
     * */
    var myUpload = function (option) {

        var file, formData, xhr, loadedevt, total, per, Url,  uploading;

        formData = new FormData();
        xhr = new XMLHttpRequest();
        url = option.url;
        file = option.file;

        //上传数据之前对数据的校验,常规包括不能null,文件类型,大小的限制
        if (option.beforeSend instanceof Function) {
            if (option.beforeSend(file) === false) { //校验在回调函数里实现,返回false校验不通过
                return false;
            }
        }

        //校验成功formData追加文件
        formData.append("files", file);

        //append 其他数据
        if(option.otherRequestData instanceof Object) {
            var _requestDate = option.otherRequestData;
            for(var key in _requestDate) {
                formData.append(key, _requestDate[key]);
            }
        }


        //事件回调
        // event callbacks
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if ((xhr.status >= 200 && xhr.status <= 300) || xhr.status === 304) {
                    option.successF instanceof Function && option.successF(xhr.responseText);
                }
                else {
                    option.errorF instanceof Function && option.errorF(xhr.responseText);
                }
            } else {
                option.errorF instanceof Function && option.errorF();
            }
        };

        //侦查当前附件上传情况
        /**
         * 附件的上传进度条方法在xhr.upload.onprogeress上,
         * 还有一个xhr.onprogress,是下载时候的进度条,***
         * */
        xhr.upload.onprogress = function (event) {
        // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0
         if (evt.lengthComputable) {
            loadedevt = event.loaded;
            total = event.total;
            per = Math.floor(100 * loadedevt / total);

        }
            //执行回调
            option.uploadProgress instanceof Function && option.uploadProgress(per);

        };

        xhr.open("post", url, true); //不能是GET, get请求数据发送只能拼接在URL后面
        xhr.setRequestHeader('Accept', 'application/json, text/javascript');

        xhr.send(formData);

    };

    window.myUpload = myUpload;
})(window, document);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【重要】你不得不知道的文件上传进度提示
当上传的文件相对较大时,用户可能需要等待较长的时间,这个时候前端如果没有任何提示的话,体验不是很好,如果有上传进度提示,就会好很多。而要在上传过程实时显示上传进度,则需要已上传的大小和文件总大小。
胡哥有话说
2019/07/25
1.1K0
XMLHttpRequest Level 2 使用指南
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。 最早,微软在IE 5引进了这个接口。因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生。 但是,这个接口一直没有标准化,每家浏览器的实现或多或少有点不同。HTML 5的概念形成后,W3C开始考虑标准化这个接口。2008年2月,就提出了XMLHttpRequest Level 2 草案。 这个XMLHttpRequest的新版本,提出了很多有用的新功能,将大大推动互联网革新。本文就对这个新版本进行详
ruanyf
2018/04/12
1.1K0
XMLHttpRequest Level 2 使用指南
FormData使用方法详解
张培跃 ID:laozhangsishu 不止于前端 关注 FormData的主要用途有两个: 1、将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率。 2、异步上传文件 一、创建formData对象 1、创建一个空对象: //通过FormData构造函数创建一个空对象 var formdata=new FormData(); //可以通过append()方法来追加数据 formdata.append("name","laotie");
用户1272076
2019/03/27
1.8K0
文件上传的最佳前端体验做法
网页开发者们想了很多办法,试图提升文件上传的功能和操作体验,在各种Javascript库的基础上,开发了五花八门的插件。可是,由于不同浏览器之间的差异,缺乏统一接口,这些插件要么用起来很麻烦,要么不能普遍适用。
javascript.shop
2019/09/05
1.9K0
文件上传的最佳前端体验做法
文件上传的渐进式增强
文件上传是最古老的互联网操作之一。 20多年了,它几乎没变,还是原来的样子:操作麻烦、缺乏交互、用户体验不佳。在这个新技术日新月异的时代,显得非常落伍。 网页开发者们想了很多办法,试图提升文件上传的功
ruanyf
2018/04/12
1.5K0
文件上传的渐进式增强
《大胖 • 小课》- 玩玩多文件配多进度上传
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第4节-《玩玩多文件配多进度上传》
zz_jesse
2020/03/17
6280
Java 单文件、多文件上传 / 实现上传进度条
实现:单文件上传、多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件
Krry
2019/08/13
7.2K0
jQuery实现上传文件获取进度条
<!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>上传文件</title> </head> <body> <input type=
明知山
2020/09/03
1.9K0
Vue项目文件拖拽上传攻略
在现代Web开发中,文件上传是一个常见的需求。传统的文件上传方式通常需要用户手动点击上传按钮,然后选择文件。这种方式虽然简单,但在用户体验上存在一定的局限性。为了提升用户体验,我们可以使用拖拽上传的方式,让用户更加直观地完成文件上传操作。本文将详细介绍如何在Vue项目中实现文件拖拽上传功能,包括基本实现步骤、使用第三方库、优化和扩展技巧等内容。
Front_Yue
2025/01/14
5620
Vue项目文件拖拽上传攻略
Nodejs实现图片的上传、压缩预览、定时删除。
这里我们用到的是koa框架,它可是继express框架之后又一个更富有表现力、更健壮的web框架。
Vam的金豆之路
2021/11/30
1.6K0
Nodejs实现图片的上传、压缩预览、定时删除。
你真的会使用XMLHttpRequest吗?
我们通常将Ajax等同于XMLHttpRequest,但细究起来它们两个是属于不同维度的2个概念。
用户2458785
2018/08/29
1.7K0
你真的会使用XMLHttpRequest吗?
springmvc + h5(进度条)文件上传
版权声明:本文为博主原创文章,未经博主允许不得转载。 1.先上效果图 1.1弹出附件框 1.2选择文件,点击上传(这里做了一个简单的校验) 1.3点击上传 1.4上传成功 刷新列表 2
DencyCheng
2018/11/05
2.8K1
文件上传那些事儿
导语 作为一枚初入鹅厂的鲜鹅,对这里的一切都充满着求知欲。看到我们的KM平台如此生机勃勃,各种技术分享交流如火如荼,在努力的汲取着养分的同时也期待自己能为这个生态圈做出贡献。正好新人导师让我看看能否把
谭伟华
2017/05/04
10.8K5
spring boot 用js实现上传文件(包含其他字段)显示进度
1、由于我使用了框架内置对象处理二进制文件信息,所有接收过程完全被封闭在框架内置对象中,直到请求结束才返回信息提示,上传的过程进度无法访问。我使用了js,不通过form表单action跳转后台上传。
jiankang666
2022/05/12
2K0
如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能
文件上传和下载是Web开发中非常基础的功能,但在实际开发中,我们经常需要实时显示文件上传或下载的进度。这篇文章将介绍如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能。
网络技术联盟站
2023/06/03
2.8K0
js文件异步上传进度条
进度条的应用是为了显示的告诉用户文件上传了多少,对于小文件的上传基本上应用不到进度条。进度条主要应用于大文件的上传,在于告诉用户上传情况,不至于让用户无状态等待,增加了用户的体验,如果没有进度条,在上传过程中,用户不知道是不是卡死了,这种体验就很差了,下面我们来说一下如何在异步上传时显示进度条。
OECOM
2020/07/02
10.7K0
AJAX的post请求与上传文件
之前介绍了AJAX的get的请求方式与跨域请求,除此之外AJAX还可以进行异步的post请求,在使用post方式的请求时需要设置请求头,如下:
端碗吹水
2020/09/23
3.5K0
AJAX的post请求与上传文件
FormData对象的应用
XMLHttpRequest 是一个浏览器接口,通过它,我们可以使得 Javascript 进行 HTTP (S) 通信。XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式。2008年 2 月,XMLHttpRequest Level 2 草案提出来了,相对于上一代,它有一些新的特性,其中 FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。
OECOM
2020/07/02
1.8K0
关于ajax无刷新上传和下载
这是一个没什么含量但是又用的比较多又不得不说的问题,其实真的不想说,因为没什么好说的。
chuchur
2022/10/25
2.7K0
jQuery.ajax文件上传进度条
XMLHttpRequest.upload 向后台上传文件时监听进度,主要使用的是XMLHttpRequest提供的upload方法,此方法会返回一个XMLHttpRequestUpload对象,用来表示上传进度 。 —— XMLHttpRequest.upload
KEVINGUO_CN
2020/03/16
3.6K0
相关推荐
【重要】你不得不知道的文件上传进度提示
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档