起因:
今天忽然有个客户报
Bug
,无法上传文件,报错引发类型为System.Web.HttpUnhandledException
的异常 ,PostedFile.FileName
经过反复调试,发现服务器控件回传到服务器却没有任何数据。
处理过程:
- 首先进行后台调试,打断点发现
PostedFile.FileName Is Nothing
,马上查代码确认是否设置input
为服务器控件、是否名字调用正确 - 确认为服务器控件,名字正确,考虑
PostBack
过程出现问题 - 定位问题为
UpdatePanel
与UpLoadFile
不兼容
原因:
目前UpdatePanel
还不支持文件上传,UpdatePanel
中的内容是通过XmlHttp
实时填充的,在你让他显示之前,查看页面源代码里面是空的。一个动态控件更新普通数据没问题,但上传文件就不行了,回传服务器的PostedFile.FileName
始终会是空的。
解决办法:
一、UpdatePanel
中设置PostBackTrigger
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="cmdUpLoad" runat="server" Text="上传"/>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="cmdUpLoad" />
</Triggers>
</asp:UpdatePanel>
二、是用普通div
代替asp:Panel
,并写了2个函数来动态发送控制脚本,按钮事件中只要调用该函数即可
<div id="Panel1"></div>
private void ShowPanel()
{
string script = "document.getElementById('Panel1').style.display='';";
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ShowPanel", script, true);
}
private void ClosePanel()
{
string script = "document.getElementById('Panel1').style.display='none';";
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ClosePanel", script, true);
}
三、上传附件是放在一个iframe
里面
//要上传文件的UpdatePanel
<Asp:UpdatePanel ID="upLoad" runat="server">
<ContentTemplate>
<iframe id="file" name="file" src="attachment.aspx"></iframe>
</ContentTemplate>
</Asp:UpdatePanel>
//上传文件的页面,里面放FileUpload控件
<div>
<asp:FileUpload ID="FileUpload" runat="server" />
<asp:Button ID="btnUpLoad" runat="server" Text="文件上传" />
</div>
//上传文件之后调用主页面的js,回传上传文件情况
<script>
window.top.callBack(fileName);
</script>
//主页面处理返回值
<script>
function callBack(fileName)
{
document.getElementById('txtFileName').innerHTML=fileName;
}
</script>
特别提示:
FileUpload
是在.net
中用到比较多的上传文件的控件,而上传文件的过程中涉及到最多的就是文件名和文件路径。
PostedFile.FileName
:是获取文件的路径,即FileUpload
控件文本框中的所有内容
FileName
:获取上传的文件名。
如: 浏览器点击“浏览…”选择了文件后,文本框中显示的是D:\Files\Test\Demo.txt
, 我们想要的也是这个。
IE :
-
FileUpload1.PostedFile.FileName
得到的是:D:\Files\Test\Demo.txt
-
FileUpload1.FileName
得到的是:Demo.txt
Chrome:
-
FileUpload1.PostedFile.FileName
得到的是:Demo.txt
-
FileUpload1.FileName
得到的是:Demo.txt
网友评论