如题所示,实现一个Ajax模式的文件上传有多难?这并不是一个疑问句,这是一个反问句。
在这里我先声明,不要认为一提到Ajax就是讲XHttpRequest, Ajax还要包括基于frame的操作,对!我说的是古老的frame。
xhttpRequest并不能实现文件上传,所以涉及到文件的上传,我们还得回到frame上,尤其是iframe。

需要的材料:
1,你掌握基本的Javascript技能。
2,一个隐藏的form和iframe,这里我分别命名为uploadForm和uploadResponse.
3,一个负责接收文件的页面,名字叫做UploadImage.aspx。
4,一个负责显示文件的页面,名字叫做File.aspx。

基本原理:
通过复制当前form(form1)中的input type=file 的html元素到另一个专用于文件上传的form(uploadForm)中,而切uploadForm的target指向到一个隐藏的iframe(uploadResponse)框架的name.这样,当执行uploadForm的submit()操作时,就会通过uploadResponse将uploadForm的内容post到UploadImage.aspx页面去执行,由于iframe元素uploadResponse及form元素uploadForm元素都是位于一个隐藏的div元素中,所以访问者自始至终都不会见到多余的东西。

实例:
Default.aspx页面。

<scripttype="text/javascript">
functionuploadImage(){
varfile=document.getElementById("imageFile");
varuploadFormElement=document.getElementById("uploadForm");

//显示进度条document.getElementById("processDiv").style.display="block";//the progress div//复制图片数据uploadFormElement.removeChild(uploadFormElement.imageFile);
        uploadFormElement.appendChild(file);
        document.getElementById(
"uploadImageDiv").innerHTML='<input type="file" id="imageFile" name="imageFile" />';

//提交图片数据uploadFormElement.submit();
    }

functionuploadImageResponse(response){
        document.getElementById(
"processDiv").style.display="none";//hide progresss divvarerrLabel=document.getElementById("uploadMessage");
        errLabel.innerHTML
="";
        window.eval(
"var k="+response);
if(k.status==1)
            errLabel.innerHTML
=k.message;
elseif(k.status==2)
            errLabel.innerHTML
=k.message;
else            eval("tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'img', { src:'"+k.message+"',style:'border:0px;'}, null);");

    }

functionuploadButton_onclick(){

    }

</script>
<formid="form1"runat="server"><div><!--Gets replaced with TinyMCE, remember HTML in a textarea should be encoded--><tinymce:TextAreaID="elm1"theme="advanced"plugins="spellchecker,safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template"            theme_advanced_buttons1="bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,fontselect,fontsizeselect,forecolor,backcolor,image"            theme_advanced_buttons2=""theme_advanced_buttons3=""theme_advanced_buttons4=""            theme_advanced_toolbar_location="top"theme_advanced_toolbar_align="left"theme_advanced_path_location="bottom"            theme_advanced_resizing="true"runat="server"/><divstyle="margin-top: 5px">            上传图片:
<br/><divid="uploadImageDiv"><inputtype="file"id="imageFile"name="imageFile"/></div><inputtype="button"id="uploadButton"onclick="uploadImage();"value="上传"/><spanid="uploadMessage"style="border: 1px solid #cccccc; color: Red;"></span></div><divid="processDiv"style="display: none; color: #660066; font-family: Arial;"><imgsrc="/images/loading2.gif"alt="uploading"/>            图片上传中<spanid="fileName"/></div></div></form><divstyle="display: none;"><iframename="uploadResponse"></iframe><formid="uploadForm"action="UploadImage.aspx?t=<%= DateTime.Now.Ticks %>"target="uploadResponse"        method="post"enctype="multipart/form-data"><inputtype="file"name="imageFile"value=""/></form></div>

如上所示,首先选择准备上传的文件,然后当你点击上传按钮(name为uploadButton)时,调用uploadImage函数,该函数的作用是复制form1的input type=file的imageFile元素到uploadForm中,并替换原始的imageFile的outerhtml(原因是javascript不支持修改input type=file的元素的value属性),当然还有显示可爱的上传进度条(这样显得我们既专业又酷)。

function uploadImage(){
        var file
=document.getElementById("imageFile");
        var uploadFormElement
=document.getElementById("uploadForm");

//显示进度条document.getElementById("processDiv").style.display="block";//the progress div

//复制图片数据uploadFormElement.removeChild(uploadFormElement.imageFile);
        uploadFormElement.appendChild(file);
        document.getElementById(
"uploadImageDiv").innerHTML='<input type="file" id="imageFile" name="imageFile" />';

//提交图片数据uploadFormElement.submit();
    }

当用户点击上传按钮时,工作转由UploadImage.aspx程序接手。

protectedvoidPage_Load(objectsender, EventArgs e)
{
            Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);



intstatus=0;//状态stringmessage="";//反馈信息

//检查文件if(Request.Files.Count==0)
{
                status
=1;
                message
="请先选择要上传的文件";
                RenderUploadScript(status, message);
            }
stringext=Path.GetExtension(Request.Files[0].FileName).ToLower();
if(ext!=".jpg"&&ext!=".jpeg")
{
                status
=2;
                message
="抱歉,目前仅支持jpg格式的图片";
                RenderUploadScript(status, message);
            }

     
                Guid fileID
=Guid.NewGuid();
stringfileName=Server.MapPath(String.Format("~\\Files\\{0}.jpg",fileID));
                Request.Files[
0].SaveAs(fileName);
//记录到当前页面            RenderUploadScript(0,String.Format("File.aspx?key={0}",fileID));
        }

privatevoidRenderUploadScript(intstatus,stringmess)
{
stringscript=string.Format("<script language='javascript'> window.parent.uploadImageResponse(\"{{ status:{0},message:'{1}'}}\"); </script>", status, mess);
            Response.Write(script);
            Response.End();
        }

通过HttpWebRequest对象,我们能够获得任何由客户端post或get到服务器端的数据,UploadImage.aspx页面的工作很简单,只负责接收post过来的文件,并保存到指定的位置(方便演示,我仅仅使用了SaveAs)。
另外,要注意到一点,由于是Ajax模式的文件上传,意味着你的程序要通过javascript反馈系统出现的问题,这里我通过一个名称为status的参数来返回出现的问题,0则为一切正常,1则为用户没有提供文件,2则为用户没有上传我指定的文件类型。
当用户上传的文件没有任何问题的时候,系统保存文件并返回状态0,并附加文件的显示路径,其他状态附属的信息则是错误信息。
现在回到Default.aspx来看如何接收UploadImage.aspx反馈回来的信息,这里要考虑到UploadImage.aspx是个页面,而且隶属与iframe元素uploadResponse,所以我们通过javascipt来访问uploadResponse的所属window的对象或函数的写法如下:
"<script language='javascript'> window.parent.uploadImageResponse(\"{{ status:0,message:'File.aspx?key=guid'}}\");<script>"
Default的接应脚本则如下:

functionuploadImageResponse(response){
        document.getElementById(
"processDiv").style.display="none";//hide progresss divvarerrLabel=document.getElementById("uploadMessage");
        errLabel.innerHTML
="";
        window.eval(
"var k="+response);
if(k.status==1)
            errLabel.innerHTML
=k.message;
elseif(k.status==2)
            errLabel.innerHTML
=k.message;
else            eval("tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'img', { src:'"+k.message+"',style:'border:0px;'}, null);");

    }

仅仅是在对应的htm编辑器的内容中插入message附带的信息。

ok!!主要的难点我们都解决了。下面则是要让我们能够看到我们传上去的文件,如果不能实时看到,这个Ajax 文件上传就没啥意义了。
File.aspx页面的功能代码如下:

protectedvoidPage_Load(objectsender, EventArgs e)
{

            Guid key
=newGuid(Request.QueryString["key"]);

//图片所在路径stringfileName=Server.MapPath(String.Format("~/Files/{0}.jpg", key));
//Send the fileResponse.ContentType="image/jpeg";
            Response.WriteFile(fileName,
true);
            Response.AddFileDependency(fileName);
            Response.Cache.SetCacheability(HttpCacheability.Public);
            Response.Cache.SetAllowResponseInBrowserHistory(
true);
        }

OK!一切都完成了。
演示程序下载地址:
http://files.cnblogs.com/csharpsharper/CoolThingsShow.rar

博主推荐:

Ajax正在将我们带入到下一代的网络应用中。本书深入探讨了动态的网络应用,将Ajax和REST集成在一起作为单独的解决方案。一个很大的优势是,与Ajax相似,REST可以和现今存在的技术一起使用。现在上百万的客户端计算机都是基于Ajax的,上百万的服务器是基于REST的。. 无论你是否开发过Ajax应用程序,这都是一本理想的书。因为这本书描述了各种各样的模式和最好的实践经验。通过此书的学习,你可以快速地检查和校验你是否构造了一个高效的Ajax应用程序。...

购买Logo

转载于:https://www.cnblogs.com/csharpsharper/archive/2008/08/07/uploadfilewithiframe.html

实现一个Ajax模式的文件上传功能有多难?相关推荐

  1. php用ajaxs上传图片_php+ajax实现图片文件上传功能实例

    目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,下面介绍ajax与iframe实现异步文件上传的功能的例子. 方法一,利用jque ...

  2. ajax 上传文件实例,jquery ajax实现文件上传功能实例代码

    下面看下ajax实现文件上传 没有使用插件 一.单文件上传 文件: 上传文件 $(function () { $("#upload").click(function () { va ...

  3. query AjaxUpload实现多文件上传功能代码实例教程

    在PHP网站开发中,文件上传功能时常用到,之前我已介绍过如何利用PHP实现文件上传功能.随着WEB技术的发展,用户体验成为衡量网站成功与否的关键,今天和大家分享如何在PHP中利用Jquery实现Aja ...

  4. (转自dflying chen)使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET(我的介绍和比较,还有一篇)刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与 ...

  5. SSM开发书评网29:后台二:wangEditor图片上传;(主要内容是【wangEditor图片上传的文档要求】,【Spring MVC整合FileUpload组件,以实现文件上传功能】)

    说明: (1)本篇博客内容说明:[在后台系统,我们点击新增按钮后,会弹出新增图书对话框]→[该对话框中,包含一个wangEditor富文本编辑器]→[wangEditor富文本编辑器中,可以包含图片] ...

  6. 实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现

    之前我们已经详细介绍了WinHttp接口如何实现Http的相关功能.本文我将主要讲解如何使用libcurl库去实现相关功能.(转载请指明出于breaksoftware的csdn博客) libcurl在 ...

  7. 实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

    在<使用WinHttp接口实现HTTP协议Get.Post和文件上传功能>一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议.在最近的代码梳理中,我觉得Post和文件上传 ...

  8. Spring MVC环境中的文件上传功能实现

    在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...

  9. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

    原文:学习ASP.NET Core Razor 编程系列十三--文件上传功能(一) 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习A ...

最新文章

  1. python本地文件上传到网页_如何将文件上传到pythonweb服务器?
  2. codeforces 528D. Fuzzy Search 快速傅里叶变换
  3. 将springboot jar应用打包成镜像并在docker运行成容器
  4. 一个全屏页面切换实例
  5. laravel框架总结(一) -- 请求和响应
  6. TypeScript里一些特殊的类型
  7. VMware14.0 安装 CentOS7.2
  8. C 的Pair用法分类整理(精)
  9. thinkphp v5.0.11漏洞_ThinkPHP(5.1.x ~ 5.1.31 5.0.x ~ 5.0.23)GetShell漏洞
  10. c++ 动态数组初始值不为0?
  11. 大数据将如何重塑亚洲企业
  12. 论文笔记_S2D.70_2021_IEEE-RAL_CodeMapping:使用紧凑场景表示的稀疏SLAM的实时稠密建图
  13. 前端调用3dmax模型转换.gltf格式
  14. 微信怎么更新最新版本?两招搞定,别轻易卸载!
  15. postman接口批量测试
  16. 测试岗/测试开发岗面试真题及参考答案
  17. c#实现循环输入商品编号和购买数量,结账时应付金额并找零
  18. 浅析竞技游戏匹配机制-ELO算法
  19. unity获取物体下的所有子物体
  20. Auto js编写微信小游戏 《一笔画完》 辅助工具--开发篇

热门文章

  1. 聚合函数查询 group by having
  2. Grunt 入门指南3:创建Tasks
  3. Linux学习笔记(四)之查看登录用户
  4. 【SpringCloud从0到6】 第二节:注册中心 - eureka
  5. Windows常用快捷键整理
  6. Markdown入门指导
  7. 【Android】日常问题记录
  8. SCOM2016 OMSDK 服务无法启动
  9. loadrunner-2-9添加事务
  10. [Angularjs]国际化