C#中用js实现文件无刷新上传

来源:互联网 发布:c语言与cin.get 编辑:程序博客网 时间:2024/05/01 21:40

最近在写C# .net代码的时候,遇到一个上传刷新的问题。

 
       在新增数据项的时候,用ajax实现无刷新提交,但上传文件的时候,由于数据类型原因,不能将页面的<asp:FileUpload>中以字符串值的方式传到js里调用。我一共找到了两个方法予以解决,实现无刷新上传。
 
        第一种方法:利用js的ADODB.Stream,将文件先转换成流,再通过js上传到服务器,这样有个好处就是可以上传超大文件,并且由于是数据流,可以支持断点续传、方便显示上传进度等人性化功能。唯一的缺点是要客户端浏览器需要设置安全级别,或者安装相关ActiveX控件(这个控件自己做的,加载到页面中)。
  
        相关代码:
        文件有:1个前台页面:upload.html、 1个js控制:upload.js、 1个后台处理页面:Accept.aspx(Accept.aspx.cs)
       代码文件如下:
       upload.html          

 1<html xmlns="http://www.w3.org/1999/xhtml" >
 2<head runat="server">
 3<title>无标题页</title>
 4<mce:script src="upload.js" mce_src="upload.js" language="jscript" type="text/jscript"></mce:script>
 5</head>
 6<body>
 7<form id="form1" runat="server">
 8<div style="width:100%">
 9<input type="file" id="hidFilePath" />
10<input type="button" id="ok" onclick="BeginUpLoadFile('0', true)" title="上传" value="UpLoad"/>
11</div>
12<div id="lblLeavingsTime">TIME</div>
13<div id="returnInfo">Info</div>
14</form>
15</body>
16</html>
 
      upload.js
               

  1var g_XMLHttp = null;
  2var g_Stream = new ActiveXObject('ADODB.Stream');
  3var g_SendCount = 0;
  4var g_TotalCount = 0;
  5var g_FileSize = 0;
  6var g_UpFileType = 0 ;
  7var g_BlockSize = 1024 * 100;    //每段分为100K
  8var fileExtName = "" ;          //文件后缀名
  9var g_PauseFlag = false;
 10var g_BeginTime = null;
 11var g_guageFlag = false ;
 12var Nfilename = "" ;
 13function Init()
 14{
 15InitTitleEvent();
 16BeginUpLoadFile();
 17}

 18function MoveGuage()
 19{
 20var t_Time = new Date();
 21var t_OddTime = Math.ceil((t_Time.getTime() - g_BeginTime.getTime()) / g_SendCount * (g_TotalCount - g_SendCount) / 1000);
 22var t_OddTimeString = '';
 23if(t_OddTime >= 3600)
 24{
 25t_OddTimeString = Math.floor(t_OddTime / 3600+ '';
 26t_OddTime %= 3600;
 27}

 28if(t_OddTime >= 60)
 29{
 30t_OddTimeString += Math.floor(t_OddTime / 60+ '';
 31t_OddTime %= 60;
 32}

 33document.all.lblLeavingsTime.innerText = t_OddTimeString + t_OddTime + '';
 34}

 35//第1个参数表示上传的类型,为命名新文件提供参考
 36//第2个参数表示要不要显示状态条
 37function BeginUpLoadFile(upFileType, guageFlag)
 38{
 39if(g_Stream == null)
 40{alert("您的机器不支持ADODB.Stream."); }
 41else
 42{
 43g_guageFlag = guageFlag ;
 44g_UpFileType = upFileType;
 45g_Stream.Type = 1;
 46g_Stream.Open();
 47var pth = document.getElementById("hidFilePath").value ;
 48g_Stream.LoadFromFile(pth);
 49var fname=pth.split('\\');
 50Nfilename = fname[fname.length-1] ;
 51fileExtName = Nfilename.split('.')[1].toLowerCase();
 52g_Stream.position = 0;
 53g_SendCount = 1;
 54g_FileSize = g_Stream.size ;
 55if (upFileType == 0)   //上传图片
 56{
 57if (g_FileSize > 1024 * 1024 * 2 )   // 不能大于2M
 58{
 59document.all.returnInfo.innerText = "文件大小超过2M!" ;
 60g_PauseFlag = true;
 61return ;
 62}

 63var str = "bmp,jpg,jpeg,gif,png,icon";
 64if (str.search(fileExtName) == -1)     //图片格式不能超出范围
 65{
 66document.all.returnInfo.innerText = "文件格式不正确,请选择bmp、jpg、jpeg、gif、png、icon格式图片!" ;
 67g_PauseFlag = true;
 68return ;
 69}

 70}

 71g_TotalCount = Math.ceil(g_Stream.size / g_BlockSize);
 72g_BeginTime = new Date();
 73SendData();
 74}

 75}

 76function SendData()
 77{
 78if(g_PauseFlag)
 79{
 80return;
 81}

 82if(g_SendCount <= g_TotalCount)
 83{
 84var t_XMLDOM = null;
 85var t_Root = null;
 86var t_Node = null;
 87var t_Attribute = null;
 88t_XMLDOM = new ActiveXObject('Microsoft.XMLDOM');
 89t_XMLDOM.async = false;
 90t_XMLDOM.resolveExternals = false;
 91t_Node = t_XMLDOM.createProcessingInstruction('xml','version="1.0"');
 92t_XMLDOM.appendChild(t_Node);
 93t_Root = t_XMLDOM.createElement('Root');
 94t_XMLDOM.appendChild(t_Root);
 95t_XMLDOM.documentElement.setAttribute('xmlns:dt','urn:schemas-microsoft-com:datatypes');
 96t_Node = t_XMLDOM.createElement('Data');
 97t_Node.dataType = 'bin.base64';
 98t_Node.nodeTypedValue = g_Stream.Read(g_BlockSize);
 99t_Attribute = t_XMLDOM.createAttribute('upfiletype');
100t_Attribute.value = g_UpFileType;
101t_Node.setAttributeNode(t_Attribute);
102t_Attribute = t_XMLDOM.createAttribute('fileindex');
103t_Attribute.value = g_SendCount;
104t_Node.setAttributeNode(t_Attribute);
105t_Attribute = t_XMLDOM.createAttribute('totalcount');
106t_Attribute.value = g_TotalCount;
107t_Node.setAttributeNode(t_Attribute);
108t_Attribute = t_XMLDOM.createAttribute('filesize');
109t_Attribute.value = g_FileSize;
110t_Node.setAttributeNode(t_Attribute);
111t_Attribute = t_XMLDOM.createAttribute('blocksize');
112t_Attribute.value = g_BlockSize;
113t_Node.setAttributeNode(t_Attribute);
114t_Attribute = t_XMLDOM.createAttribute('fileextname');
115t_Attribute.value = fileExtName;
116t_Node.setAttributeNode(t_Attribute);
117t_Root.appendChild(t_Node);
118g_XMLHttp = new ActiveXObject('Microsoft.XMLHttp');
119g_XMLHttp.open('POST','AcceptFile.aspx',true);
120g_XMLHttp.onreadystatechange = XMLHttpStateChange;
121g_XMLHttp.send(t_XMLDOM);
122if (g_guageFlag){ MoveGuage(); }
123}

124else
125{
126var xx = spider.BookFile.FileObj.getFileName() ;
127alert(xx.value) ;
128document.all.lblLeavingsTime.innerText = '0秒';
129CloseWindow(document.all.cmdClose);
130document.all.returnInfo.innerText = '文件上传完成!';
131}

132}

133function XMLHttpStateChange()
134{
135if(g_XMLHttp.readyState == 4)
136{
137var rstr = g_XMLHttp.responseText ;
138if(rstr  == 'OK')
139{
140g_SendCount++;
141SendData();
142}

143else
144{
145document.all.returnInfo.innerText = rstr;
146CloseWindow(document.all.cmdClose);
147}

148}

149}

150function CloseWindow(p_OBJ)
151{
152g_PauseFlag = true;
153g_Stream.Close();
154}

155
    
   
      Accept.aspx              
1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AcceptFile.aspx.cs" Inherits="commonJS_AcceptFile" %>
2
   
 
     Accept.aspx.cs

 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Collections;
 5using System.Web;
 6using System.Web.Security;
 7using System.Web.UI;
 8using System.Web.UI.WebControls;
 9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11using System.Xml;
12using System.IO;
13using spider.BookFile;    //这是自己写的文件类
14public partial class commonJS_AcceptFile : System.Web.UI.Page
15{
16protected void Page_Load(object sender, EventArgs e)
17{
18AjaxPro.Utility.RegisterTypeForAjax(typeof(FileObj));
19XmlDocument t_XmlDocument = new XmlDocument();
20t_XmlDocument.Load(this.Request.InputStream);
21XmlNode t_XmlNode = t_XmlDocument.SelectSingleNode("Root/Data");
22FileObj t_FileOBJ = new FileObj();
23string t_upfiletype = t_XmlNode.Attributes["upfiletype"].Value;
24string t_FileIndex = t_XmlNode.Attributes["fileindex"].Value;
25string t_totalcount = t_XmlNode.Attributes["totalcount"].Value;
26string t_filesize = t_XmlNode.Attributes["filesize"].Value;
27string t_blocksize = t_XmlNode.Attributes["blocksize"].Value;
28string t_fileextname = t_XmlNode.Attributes["fileextname"].Value;
29byte[] t_File = Convert.FromBase64String(t_XmlNode.FirstChild.Value);
30FileObj.upfile myUpFile = new FileObj.upfile();
31myUpFile.FileCount = t_totalcount;
32myUpFile.FileIndex = t_FileIndex;
33myUpFile.UpFileType = t_upfiletype;
34myUpFile.FileSize = t_filesize;
35myUpFile.BlockSize = t_blocksize;
36myUpFile.ExtName = t_fileextname;
37myUpFile.t_File = t_File;
38FileObj.InsertFileList(myUpFile);
39if (FileObj.getErrMsg == "")
40{
41this.Response.Write("OK");
42}

43else
44{
45this.Response.Write(FileObj.getErrMsg);
46}

47}

48}

49
 
 
 
第二种方法:用js动态创建form和iframe上传文件,实现无刷新。优点是代码量小,无需客户端安装控件,缺点就是上传有限制大小,下面看代码:
           需要文件有:1个前台页面upload.html、  1个js函数 function upFile、 1个处理文件accept.aspx(accept.aspx.cs) 
    upload.html               

 1<html xmlns="http://www.w3.org/1999/xhtml" >
 2<head runat="server">
 3<title>无标题页</title>
 4<mce:script src="upload.js" mce_src="upload.js" language="jscript" type="text/jscript"></mce:script>
 5</head>
 6<body>
 7<form id="form1" runat="server">
 8<div style="width:100%">
 9<iframe name='hidden_frame' id="hidden_frame" style='width:150px; height:50px; display:none;'> </iframe>
10<input type="file" id="hidFilePath" />
11<input id="upBtn" type="button" class="clearBtn" style="display:none;" value="上传图片" onclick="upFile('hidFilePath');" />
12</div>
13</form>
14</body>
15</html>
 
 
function upFile
              

 1function upFile(ob)
 2{
 3var file = document.getElementById(ob) ;
 4var newName = "FileName";     //设置文件保存的名字
 5var form=document.createElement('form');
 6document.body.appendChild(form);
 7form.encoding="multipart/form-data";
 8form.method = "post";
 9form.action= "accept.aspx?nm=" + newName;
10form.target= "hidden_frame";
11var pos=file.nextSibling; //记住file在旧表单中的的位置
12form.appendChild(file);
13form.submit();
14pos.parentNode.insertBefore(file,pos);
15document.body.removeChild(form);
16}

17
 
 
accept.aspx
             
1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="up.aspx.cs" Inherits="Member_up" %>
 
accept.aspx.cs
            

 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Collections;
 5using System.Web;
 6using System.Web.Security;
 7using System.Web.UI;
 8using System.Web.UI.WebControls;
 9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11public partial class Member_up : System.Web.UI.Page
12{
13protected void Page_Load(object sender, EventArgs e)
14{
15string mz = HttpContext.Current.Request.QueryString["nm"].ToString();
16string uperr = "";
17HttpFileCollection files = HttpContext.Current.Request.Files;
18if (files.Count>0)
19{ uperr = upSingleFile(files[0], mz); }
20else { uperr = "ok"; }
21HttpContext.Current.Session["upInfo"= uperr;
22Response.Write(uperr);
23}

24//上传文件
25private string upSingleFile(HttpPostedFile file, String theFileName)
26{
27string infos = "";
28bool fileOK = false;
29string fileName, fileExtension ;
30fileName = System.IO.Path.GetFileName(file.FileName);
31if (fileName != "")
32{
33if (file.ContentLength >= 1024 * 1024 * 2)
34{
35infos = "上传文件太大,目前仅支持2M以内的图片上传!";
36}

37else
38{
39fileExtension = System.IO.Path.GetExtension(fileName).ToLower();
40String[] allowedExtensions = ".jpg"".jpeg"".gif"".bmp"".png"".icon" };
41for (int i = 0; i < allowedExtensions.Length; i++)
42{
43if (fileExtension == allowedExtensions[i])
44{
45fileOK = true;
46break;
47}

48}

49if (!fileOK)
50{
51infos = "不支持上传此类型文件!目前支持的图片格式有:jpg|jpeg|gif|bmp|png|icon";
52}

53else
54{
55file.SaveAs(System.Web.HttpContext.Current.Request.MapPath("~/books/BookPic/"+ theFileName);
56infos = "ok" + theFileName;
57}

58}

59}

60else
61{
62infos = "没有读取到文件!";
63}

64return infos;
65}

66}
 
 
 
以上为我写程序过程中遇到过的问题和探索到的解决方法,写下来一是自己在温习巩固一遍,二来是为了与大家分享,请大家指正需改进之处,以期达到共同进步!
分类: c#
东方 蜘蛛
关注 - 0
粉丝 - 0
+加关注
0 0
原创粉丝点击