html5通过ajax上传文件并显示进度

通过ajax上传文件,需要用到一个html5新特性——FormData(兼容性:chrome,ff,IE9及以上)

FormData顾名思义,就是用于存放Form的数据信息的类,它是一个不透明的类,对外只暴露一个append方法,一般只在XMLRequest的send()函数里面作为传入参数使用。所以不要想着调试的时候可以看到FormData里面的信息,各种序列化函数也无法获取其内部信息。

整套上传文件的思路是:

构建一个FormData->把文件DOM对象塞到FormData里面->send出去。


前端html代码:

<input type="file" id="fileObj"/>
<div id='loading'></div>
<button id="upload">上传</button>

这里不需要有一个显示的form标签,因为你的数据完全由FormData对象构建,所以html代码只需要有个input用来获取文件就可以了。

原生js代码:

var fd=new FormData();
fd.append("thefile", document.getElementById('fileObj').files[0]);

var xmlhttp = window.XMLHttpRequest || window.ActiveXObject;  
var xhr = new xmlhttp();

if (xhr.upload) {  //显示上传进度
                xhr.upload.addEventListener("progress", function(e) {
                    document.getElementById('loading').innerHTML=e.loaded/e.total*100; //这里的e.loaded代表已经上传的字节数,e.total代表总共需要上传的字节数
                }, false);
            }     

xhr.open('POST', 这里是你的url , true);
xhr.send(fd);

注意:这里加入:xhr.setRequestHeader("Content-Type" , "multipart/form-data" );的话,在chrome和ff中会无法发送数据。


由于这个部分使用jquery来写还有些小问题,所以这里再附上一个jquery的代码:

var fd = new FormData();
var file = $('#thefile')[0].files[0];
fd.append("thefile", file);

$.ajax({
    url: "你的url",
    type: 'POST',
    data: fd,
    processData: false,//用来回避jquery对formdata的默认序列化,XMLHttpRequest会对其进行正确处理
    contentType: false,//设为false才会获得正确的conten-Type
    xhr: function() { //用以显示上传进度
        var xhr = $.ajaxSettings.xhr();
        if (xhr.upload) {
            xhr.upload.addEventListener('progress', function(e) {
                $('#loading').text(e.loaded/e.total*100);
            }, false);
        }
        return xhr;
    },
    async: true
}).then(function(data) {
    if (data.IsSuccessful == false) {
        alert('上传失败');
    } else {
        alert('上传成功');
    }
})
jquery从1.5开始就不对外暴露xhr了,因此我们需要在进行ajax请求的时候自己传入一个构造好了xhr来获取上传进度。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值