无刷新假象   实现简易文件上传

传统的上传文件功能,点击“上传”后页面会短暂地空白,等待服务器的响应;为了提高网站的处理效率,采用模拟Ajax的无刷新假象技术,我们可以让页面在局部刷新的情况下,实现文件上传。

demo.html

 <script type="text/javascript">
     function callback(filename){
         //"$()"是封装在单独js文件中的函数:document.getElementById(id)
         $(‘photo‘).style.display = "none";
         $(‘submit‘).style.display = "none";
         $(‘msg‘).innerHTML = filename;
}
 </script>
 <body>
    <!--target="frm" 此时请求后台处理的不是body框架,而是iframe框架;后台输出的内容也都输出到frm-->
    <form method="post" enctype="multipart/form-data" target="frm" action="upload.php">
        照片:<input type="file" name="photo" id="photo"/>
              <input type="submit" id="submit" name="submit" value="上传文件"/><br/>
    </form>
    <iframe name="frm" style="display:none"></iframe><br/><!--进行模拟刷新的二级框架-->
    <span id="msg"></span>
 </body>

upload.php

 //文件上传
 if (!empty($_POST[‘submit‘])){
    $extname = strrchr($_FILES[‘photo‘][‘name‘],‘.‘);
    $filename = time().$extname;
    $file = $_FILES[‘photo‘][‘tmp_name‘];
    copy($file,‘upload/‘.$filename);
    echo "<script>parent.callback(‘$filename‘);</script>";

    流程解释

    Browser选择完要上传的文件后,点击上传文件按钮,此时body(一级框架)没有如愿将此文件提交到action="upload.php",而是target="frm"对应的iframe框架来提交;iframe是次于body框架的二级框架,由二级框架iframe发出上传请求,将文件上传给action="upload.php";在上面的html代码当中,iframe框架style="display:none",为了页面美观,我们是看不见的,如果你想看到,就设为“block”。此时页面其实有刷新,但不是整个body刷新,而是二级框架iframe刷新,由于iframe是隐藏的,而且真正的iframe默认的页面面积是很小的,导致我们认为页面是无刷新的,假象就此出现了。

   echo "<script>parent.callback();</script>";

前台等待后台的响应,后台返还js脚本调用前台一级框架的callback()函数。注意,如果没有"parent"对象,返还的js脚本就要在iframe里面执行,而我们想要js脚本在body里面执行,那么想法就成立了;还有一点,有没有发现,“上传文件、返还js脚本”这两个动作的承受者都iframe,而不是body,而且程序的执行是这样的body<=>iframe<=>upload,iframe完全是作为中间受众来体现他的价值。

callback(filename)函数接收后台传递过来的图片文件名后,主要做了两件事,隐藏上传文件的路径框、显示上传成功的图片名称。

时间: 2024-08-04 12:57:56

无刷新假象   实现简易文件上传的相关文章

JSP 实用程序之简易文件上传组件

源码下载:http://pan.baidu.com/s/1dFK58Tr (百度云提供) 文件上传,包括但不限于图片上传,是 Web 开发中司空见惯的场景,相信各位或多或少都曾写过这方面相关的代码.Java 界若说文件上传,则言必称 Apache Commons FileUpload,论必及  SmartUpload.更甚者,Servlet 3.0 将文件上传列为 JSR 标准,使得通过几个注解就可以在 Servlet 中配置上传,无须依赖任何组件.使用第三方组件或 Servlet 自带组件固然

python——基础篇-简易文件上传

post_server import socket import os sk=socket.socket() address=('127.0.0.1',8000) sk.bind(address) sk.listen(3) print('waiting...') BASE_DIR=os.path.dirname(os.path.abspath(__file__)) while 1: conn,addr=sk.accept() while 1: data=conn.recv(1024) cmd,f

Fine Uploader文件上传组件

最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用Fine Uploader. Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似IE版本必须是9或是更高的IE10].在不同浏览器中提供统一用户体验.该组件基本覆盖目前所有主流浏览器.同时没有任何第三方组件依赖.相当Clear.在服务器端已经覆盖支持了ASP.NET/ColdFusion/Java/Node.js/Perl/PHP/Python. 对上传细节类似限制文件大

Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认"拿来主义",只是我个人更喜欢凡是求个所以然.本篇将阐述通过Html,IHttpHandler和 IHttpAsyncHandler实现文件上传和上传进度的原理,希望对你有多帮助. 效果图: 本文涉及到的知识点:1.前台用到Html,Ajax,JQuery,JQuery UI 2.后台用到一般处理程序(IHttpHandler)和

Javascrpt无刷新文件上传

最近工作中遇到上传文件问题,主要需求是一步点击上传,兼容ie8+,当时用的dojox/form/uploader控件,这两天扒了一下源码,明白了原理拿出来分享一下. 总体思路如下: 1.对于支持XMLHttpRequest2的浏览器使用FormData通过ajax上传 2.对于ie10一下的浏览器使用iframe异步上传,还需后台服务器做相应处理,这部分也是dojo/request/iframe上传文件的原理. 一.使用FormData上传文件 FormData最频繁使用的功能就是表单序列化及创

【JS】ajax 实现无刷新文件上传

一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 1 <form target="hiddenFrame" method="post" enctype="multipart/form-data" action='xx'> 2 <input value=""/> 3 <iframe name="hi

无刷新的的文件上传

一. 通过iframe来实现无刷新的的文件上传,其实是有刷新的,只是在iframe里面隐藏了而已 简单的原理说明: <form id="form1" method="post" action="upload.do" enctype="multipart/form-data"  target="uploadframe" > <input type="file" id=&q

使用PHP和HTML5 FormData实现无刷新文件上传教程

无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单请求,并通过 XMLHttpRequest 来发送.通过 FormData 对象发送文件也是可以的,如此则无刷新上传就变的非常简单了. 那么 FormData 怎么使用呢?下面phpstudy对此进行简单的介绍. 1. 构造 FormData 对象 想得到一个FormData对象,很简单: var

无刷新文件上传

无刷新文件上传 ajax的FormData对象完成无刷新操作 ajax level 2 标准 可以对文件操作,但是只支持新的浏览器(不兼容低版本的IE),是H5标准 注意事项: 表单大小 单个文件上传大小 ? 实操: 写一个form表单,但是需要注意的是,不为form表单设置 enctype属性 为上传的按钮绑定一个点击事件,完成ajax提交上传文件 利用FormData收集form表单里面的数据(普通数据 + 上传域里面的) 要利用ajax对象的upload成员的onprogress句柄来监控