最近 做项目的时候,遇到一个奇怪的问题,就是我需要上传n个文件,其中需要通过js脚本动态创建input type为file的元素,我在后台通过Request.files死活都获取不到前台的这些元素的集合。百思不得其解,我就在页面上拖了一个FileUpload的控件,这时候调试的时候竟然能获取通过js创建的元素以及刚才的fileupload控件的集合,我一去掉这个fil<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>"");
<script language="javascript" type="text/javascript">
//[CDATA[
window.onerror=function()...{ window.status='';return true;}
function Quote(id,user,date)
...{
var o = document.getElementById(id);
var str = "";
str = "<fieldset><legend>原帖由 <b>" + user + "</b> 在 " + date + " 发表:</legend>";
str +=" " + o.innerHTML + "</fieldset>";
try
...{
AddToContent(str);
}
catch(e)...{}
}
function AddToContent(strHTML)
...{
var oEditor = window.parent.FCKeditorAPI.GetInstance('FCKeditor1');
if(oEditor.EditorWindow==null)
...{
alert("请将在线编辑器切换为编辑状态之后再引用!");
return;
}
try
...{
oEditor.InsertHtml(strHTML);
}
catch(e)...{}
}
var filecount = 0;
function addfile(id)
...{
if(document.getElementById(id).value != "")
...{
var filecount = parseInt(id.replace("file",""));
//获得路径,文件名和扩展名
var str_filepath = document.getElementById("file" + filecount).value;
var str_file = str_filepath.substring(str_filepath.lastIndexOf("/") + 1,str_filepath.length);
var str_fileextensions = str_file.substring(str_file.lastIndexOf(".") + 1,str_file.length);
var objFiles = document.getElementById("div_files");
var objDivPre = document.getElementById("div_file" + filecount);
objDivPre.appendChild(document.createTextNode(" "));
var objSpan = document.createElement("span");
objSpan.id = "fileinfo" + filecount;
//<!--添加ID显示开始
objSpan.appendChild(document.createTextNode("["+ filecount +"]"));
//添加ID显示结束-->
objSpan.appendChild(document.createTextNode(" "));
//<!--添加删除按钮开始
if(filecount != 1)
...{
var objLink = document.createElement("a");
objLink.href = "javascript:DeleteFile('"+ filecount +"');";
objLink.appendChild(document.createTextNode("删除"));
objSpan.appendChild(objLink);
//添加删除按钮结束-->
}
else
...{
objSpan.appendChild(document.createTextNode(" "));
}
objSpan.appendChild(document.createTextNode(" "));
//<!--添加文件名称开始
//添加文件名
var objSpan1 = document.createElement("span");
objSpan1.id = "fileimg" + filecount;
objSpan1.name = "fileimg" + filecount;
objSpan1.setAttribute("style","padding-left:5px;");
objSpan1.appendChild(document.createTextNode(str_file));
objSpan.appendChild(objSpan1);
//添加文件名称结束-->
//objFiles.appendChild(objSpan);
objDivPre.appendChild(objSpan);
if (filecount == 5)
...{
return;
}
//清空File控件中的内容
//document.getElementById("picfile").select();
//document.execCommand('Delete');
//防止用户更换图片
document.getElementById("file" + filecount).onclick = function()...{return false};
//计数加1
filecount += 1;
var objDiv = document.createElement("div");
objDiv.id = "div_file" + filecount;
objFiles.appendChild(objDiv);
//添加一个新的文件框
objSpan.appendChild(document.createElement("br"));
//添加描述
var objFile = document.createTextNode("描述:");
objDiv.appendChild(objFile);
objFile = document.createElement("input");
objFile.type = "text";
objFile.id = "desc" ;//+ filecount;
objFile.name = "desc" ;//+ filecount;
objFile.setAttribute("class", "input01");
objFile.className = "input01";
objFile.style.width = "82px";
objDiv.appendChild(objFile);
objDiv.appendChild(document.createTextNode(" "));
//添加附件
objFile = document.createTextNode("附件:");
objDiv.appendChild(objFile);
objFile = document.createElement("input");
objFile.type = "file";
objFile.id = "file" + filecount;
objFile.name = "file" + filecount;
objFile.setAttribute("class", "input01");
objFile.className = "input01";
objFile.unselectable = "on";
objFile.style.width = "150px";
objFile.onchange = function()...{addfile(this.id);};
objDiv.appendChild(objFile);
}
}
function IsPicFile(str_fileextensions)
...{
switch(str_fileextensions.toLowerCase())
...{
case "gif":
return true;
break;
case "jpg":
return true;
break;
case "jpge":
return true;
break;
case "png":
return true;
break;
case "bmp":
return true;
break;
default:
return false;
break;
}
}
function DeleteFile(id)
...{
//删除当前节点
var objFiles = document.getElementById("div_files");
var objDiv = document.getElementById("div_file" + id);
objFiles.removeChild(objDiv);
}
//]]
</script>Html关键部分代码如下:
<table width="724" border="0" align="center" cellpadding="0" cellspacing="0">
<tr class="line08">
<td height="28" class="con_td0061">
用户名:</td>
<td>
<asp:TextBox ID="txtUserName" CssClass="input01" runat="server" Width="82px" ReadOnly="True"></asp:TextBox></td>
</tr>
<tr class="line08">
<td height="28" class="con_td0061" width="84">
标 题:</td>
<td width="640">
<asp:TextBox ID="txtTopic" runat="server" CssClass="input01" MaxLength="50"
Width="300px"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvTitle" runat="server" ControlToValidate="txtTopic"
ErrorMessage="*"></asp:RequiredFieldValidator>不得超过25个汉字或50个英文字符</td>
</tr>
<tr class="line08">
<td height="28" class="con_td0061" valign="top">
内 容:</td>
<td style="padding-bottom: 5px; padding-top: 5px">
<FCKeditorV2:FCKeditor ID="FCKeditor1" runat="server" BasePath="/Forum/FCKeditor/"
Height="412px" Width="615px">
</FCKeditorV2:FCKeditor>
<asp:RequiredFieldValidator ID="rfvContent" runat="server" ControlToValidate="FCKeditor1"
ErrorMessage="*"></asp:RequiredFieldValidator></td>
</tr>
<tr>
<td></td>
<td >
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td height="25" >
上传附件(单个附件不能超过 1MB 如果上传文件过大会使上传速度过慢)</td>
</tr>
<tr>
<td height="25" >
<div id="div_files">
<div id="div_file1">描述:<input type="text" id="desc" name="desc" class="input01" style="width: 82px" /> 附件:<asp:FileUpload ID="file1" CssClass="input01" runat="server" Visible="true" Width="150px" /></div>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table align="center" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="42">
<a href="#" onfocus="this.blur()"></a>
<asp:ImageButton ID="ibtPost" runat="server" ImageUrl="/forum/images/for_butt05.gif"
OnClick="ibtPost_Click" /></td>
<td width="10">
</td>
<td>
<a href="#" onfocus="this.blur()"></a>
<asp:ImageButton ID="ibtClear" runat="server" ImageUrl="/forum/images/for_butt06.gif"
OnClick="ibtClear_Click" /></td>
</tr>
</table>后台的关键代码如下:
protected void Page_Load(object sender, EventArgs e)
...{
file1.Attributes.Add("unselectable","on");
file1.Attributes.Add("style","width: 150px");
file1.Attributes.Add("onchange","addfile(this.id);");
if (!IsPostBack)
...{
//codes omitted
}
}
//可以通过这样的方法获取Files集合了
在.NET 2.0项目中遇到一个棘手问题,当使用JavaScript动态创建input type=file元素时,后台Request.Files无法获取到上传文件。在页面添加一个FileUpload控件后,可以同时获取动态元素和控件的文件。为解决这个问题,采用的方法是在页面初始化时保留一个FileUpload服务器控件,其余通过JS动态生成。关键的JS和后台C#代码已给出。
246





