javascript实现图片伪异步上传

实现逻辑

首先要知道, ajax没法发送带有文件的post请求,因此仍是要用同步的方式,可是刷新的时候,咱们不要在原来的页面刷新,去一个隐藏的iframe里面刷新,form表单中action正常填写处理文件上传的操做。紧接着的target填写一个隐藏的iframe。 这样表单提交以后,文件会被上传,被刷新页面为隐藏的iframe,所以用户看到的效果和ajax处理的效果是同样的。ajax

dom结构

在这里有两个须要注意的地方,一是iframe是隐藏的,对用户不可见。二是form的target属性就是iframe的id属性,必须确保这个地方的一致,不然获取不到服务器的回传地址服务器

<form action="#" method="post" enctype="multipart/form-data" target="hidden_frame"  id='upload'>
    <input type="file" name="pic" accept="image/gif;image/jpg;" />
</form>
<iframe style="display:none" name='hidden_frame' id="hidden_frame" style='display:none'></iframe>

图片预览

通常在图片上传以前,咱们但愿用户能够预览到上传以后的样子,这里有两种处理方式。一个是等图片上传成功以后,服务器返回图片的地址,将图片显示,因为中间的时间差很小,给用户一种错觉好像真的是在预览。第二种方式是在图片上传以前,获取input中的本地图片地址,而后显示,因为是显示本地的图片,因此没有时间差,实现真正的预览。简单的逻辑逻辑代码以下dom

$("#userHeadImg").change(function(event) {                    
     var file = $(event.target)[0].files[0];
     var src = URL.createObjectURL(file);
     if(file){
        //表示获取到了图片
     }else{
        //表示点击了取消
     }
     //这里的src就是图片的地址,将它放在任意一个img标签的src属性里面      
});

开始上传

在onchange事件里面促发form的submit事件,上传图片post

$("#upload").submit();

获取服务器回传的图片url

服务器将地址返回到iframe,iframe会被刷新。使用js监听iframe的onload,一旦有onload发生,就表示服务器回传了信息优化

var imgsrc=$(this).contents().find("pre").text();

增长上传文件类型限制

accept="image/gif;image/jpg;"

思考

这种方式对于单张图片上传没有问题,若是是多张,该怎样优化?this

相关文章
相关标签/搜索