博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dhl:页面无刷新ajax上传文件--模拟iframe,超简单
阅读量:4599 次
发布时间:2019-06-09

本文共 5166 字,大约阅读时间需要 17 分钟。

前段时间在解决ajax上传文件时折腾了好一阵。直接用$.post上传文本信息肯定是没有问题的。但是$.post直接上传图片是不可行的。

后来看到网上的一些解决方案,有现成的ajax上传文件的封装的方法也有利用flash的。flash确实是个好方法 但是不是每个人都会flash的而且下载下来现成的方法要做修改也不是件易事,且文件相对较大。

最后只好模拟iframe来实现。发现相当的简单。

<iframe name="ajaxUpload" style="display:none"></iframe>

<form name="from1" id="from1" method="post" action="url"  enctype="multipart/form-data" target="ajaxUpload">     这里是重点。要上传文件enctype这个属性不可少,target的值改为iframe的name的值。

<table>

   <tr>

      <td>附件:</td>

      <td><input type="file" id="document" name="document"/></td> 

   </tr> 

</table> 

</form>

 

上面是HTML

下面写一下js代码,我是用的jQuery所以在用的时候载入jquery的库是必不可少的。

 $(function(){

        if($.browser.msie){

             window.form1.submit();}else{

             $("#form1").submit();}

       });

 //这里是做了一个浏览器版本的判断,因为IE是不太符合规范的一个浏览器,尤其是IE6。IE6是不直接支持$("#idName").submit();这种方式的。

然后在服务端要怎么着呢,而且还得返回一个值,直接submit是无法返回值的

public void Upload()

{

    HttpPostedBase ff=Request.Files["document"];//这里是获取上传的文件流,也可以用索引值来表示如果是多个文件的话

   string fileName=System.DateTime.Now+ff.FileName.ToString();   //这里取出来的文件名是没有后缀的,所以要保存的话还需要取出文件拓展名。这里就不写过细,只是为描述这样一个思路。

    try{

          SaveAs(documentPath+fileName+extendtionName); 

           Response.Write("<script type='text/javascript' type='language'>parent.window.callBackMethod('上传成功');</scrpt>");

       } 

     catch

     {

       Response.Write("<script type='text/javascript' type='language'>parent.window.callBackMethod('上传失败');</scrpt>");  //parent.window.methodName();这个是JS调用父页的方法。因为现在模拟一个iframe上传文件,这个iframe的作用就是一个中间站的作用。在父页点击上传后通过target会将页面文档流传入iframe中再上传服务端作处理。服务端有响应之后然后再在iframe里面显示出来,而不是直接在父页面显示出结果。这里可能就是一个alert()弹出一个对话框提示一下,如果是这样那么不调父页方法也行。如果想把这提示的内容丰富一点比如弹出个类似人人网的蓝色的对话框之类的。

     } 

 模拟iframe其实是页面局部更新,但是页面中的这个iframe没有内容而且还是不显示的,所以它刷新了完全不会影响到整个页面。

想Request.Files方法,你还是要找那些基于ActiveX、Flash、Siverlight插件而实现的上传组件,纯粹的javascript是做不到的。
 
我的代码:
 
 
<%@ WebHandler Language="C#" Class="UpClientPackage" %>using System;using System.IO;using Lsense.Cn;using System.Web;public class UpClientPackage : IHttpHandler{    public readonly string UploadPackagePath = "/upload/Package/";        public void ProcessRequest (HttpContext context) {        //context.Response.ContentType = "text/plain"; 一定要注释词句        //context.Response.Write(UpFile(UploadPackagePath, context.Request["callBack"]));        context.Response.Write("");        //string rc =Lsense.Cn.Commons.UpFileHelper.UpFile("upsdk", context.Request["callBack"]);        //context.Response.Write(rc);    }     public bool IsReusable {        get {            return false;        }    }    ///     /// 判断文件类型    ///     ///     /// 
public bool CheckFileExt(string re) { string fileType = re.Substring(re.LastIndexOf('.') + 1).ToLower(); if (Lsense.Cn.Commons.Config.ValidUpLoadFileType.Contains(fileType)) { return true; } return false; } /// /// 上传 /// /// /// ///
public string UpFile(string toFilePath, string callBackJsFunction) { HttpPostedFile postedFile = HttpContext.Current.Request.Files["upsdk"]; string fileFullName = postedFile.FileName; string fileEx = fileFullName.Substring(fileFullName.LastIndexOf('.')); try { if (toFilePath.EndsWith("/") == false) toFilePath = toFilePath + "/"; //物理完整路径 string toFileFullPath = HttpContext.Current.Server.MapPath(toFilePath); //检查是否有该路径 if (!Directory.Exists(toFileFullPath)) { Directory.CreateDirectory(toFileFullPath); } if (!CheckFileExt(fileEx)) { return ""; } if (postedFile.ContentLength > 102400000) { return ""; } string fileName = DateTime.Now.Ticks + fileEx; //将要保存的完整文件名 string toFile = toFileFullPath + fileName; postedFile.SaveAs(toFile); string packName; string packDownUrl = Lsense.Cn.Commons.WebUtil.GetVirtualPathUrl() + this.UploadPackagePath + fileName; bool b = Lsense.Cn.Commons.WebUtil.GetApkPackName(fileName, out packName); string re = b ? "程序包名称:" + packName : "程序包名称提取失败,请检查您上传的包程序!"; return ""; } catch { return ""; } }}

  Html:

 

                上传程序包:                        

  Js;

//dhl add upsdk function test(data) {     alert(data); }function ajaxSdkUpload(obfile_id,obj_loading,obj_msg) {    //准备提交处理    $("#loading_msg" + obj_loading).html("正在上传请稍后...");    $("#divmsg" + obj_msg).html("");    var o = $("#" + obfile_id);    o.submit();}function upsdkfilldata(data) {    alert(data);    var stringArray = data.split("|");    $("#divmsg").html(stringArray[0]);    $("#fileName").val(stringArray[1]);    $("#packName").val(stringArray[2]);    $("#loading_msg").html("");}function upkjfilldata(data) {    var stringArray = data.split("|");    $("#upkjmsg").html(stringArray[0]);    $("#ex_control").val(""+stringArray[1]);    $("#actionpackname").val(stringArray[2]);    $("#upkjloading").html("");}

  

转载于:https://www.cnblogs.com/dudu837/archive/2011/08/24/2152206.html

你可能感兴趣的文章
Coursera公开课笔记: 斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”...
查看>>
竞价广告系统-广告检索
查看>>
强哥PHP面向对象学习笔记
查看>>
[转]基于.NET平台常用的框架整理
查看>>
Symbian (Read Inbox)读取收件箱的内容
查看>>
良好的编程规范
查看>>
struts2 入门
查看>>
.net 编译原理
查看>>
mean 快速开发和现有技术的对比分析
查看>>
Metro Style app :浏览器扩展
查看>>
linux的kernel是怎样工作的(TI_DM36X_ARM系统)(1)
查看>>
[luogu4310] 绝世好题 (递推)
查看>>
[luogu3203 HNOI2010] 弹飞绵羊 (分块)
查看>>
-Dmaven.multiModuleProjectDirectory system propery is not set.
查看>>
Python2 unichr() 函数
查看>>
Python 字典 copy()方法
查看>>
Minimum Path Sum
查看>>
Remove Duplicates from Sorted Array II
查看>>
常量指针和指针常量巧妙记忆方法[转]
查看>>
python-haproxy作业讲解视频总结
查看>>