无刷新上传文件(支持ie8+)

2017-08-02  本文已影响0人  helloyoucan

思路:

利用form表单提交文件,然后提交成功后跳转到iframe 里面,把这个iframe 隐藏掉,然后返回的信息就渲染到iframe 里面,再获取iframe 里面的内容。
(这里浏览器会报有关X-Frame-Options 的问题,解决办法:https://stackoverflow.com/questions/28647136/how-to-disable-x-frame-options-response-header-in-spring-security

如果只需要兼容ie9+,可以使用formData,再使用ajax异步上传即可。

下面是兼容ie8的做法

html

 <div class="upload-file">
     <div class="uf-button">
         <form id="uf-form" method="post" 
                action="/uploadAnnex" 
                target="uf-frame"  
                encoding="multipart/form-data" 
                enctype="multipart/form-data">
                <button id="uf-btn-upload" class="btn btn-default">
                        <span class="glyphicon glyphicon-plus"></span>
                          添加
                </button>
                <input id="uf-input-upload" type="file" name="file"/>
            </form>
            <iframe id="uf-frame" name="uf-frame" style="visibility:hidden;height: 0;border: 0;"></iframe>
    </div>
</div>

css

 .upload-file .uf-button form {
            position: relative;
}

.upload-file .uf-button form input {
    position: absolute;
    top: 0;
    opacity: 0;
    filter: alpha(opacity=0);
    height: 100%;
     width: 100%;
}

这里要特别注意,要把input 放在最上面然后设透明度为0。否则,由于ie8的安全机制,如果通过其它方式去触发input[type="file"]的点击事件,最终会获取不到input[type="file"] 的文件,导致表单上传的文件为空。

js

$('#uf-input-upload').on('change', function (e) {
    if (e.target.value.length>0) {
        $('#uf-form').submit();
        console.log("上传文件");
    }
});
//监听frame的load事件判断是否有返回信息
$('#uf-frame').on('load', function () {
    var response = $("#uf-frame").contents().find("body").html();
    console.log(response);
    if (response.length > 0) {
        try {
            response = JSON.parse(response);
           console.log("返回的信息:"+response );
    } else {
        message.add("上传文件失败", "error");
    }

});

这里要注意,由于返回的信息用iframe 接受,所以要返回text,然后再解析,而不要直接返回json格式的数据。

上一篇下一篇

猜你喜欢

热点阅读