我们都知道在asp.net开发中,往往使用UpLoadFile.PostedFile.FileName方法来获取文件的完整路径,今天在IE8中试了下,结果获取不到路径,只能获取相应的文件名,这是什么原因造成的呢?本文就为大家解决疑惑,发现最后是浏览器的问题在IE6是可以获取到的 IE8就只能获取名称了
这个问题源自一位热心而且踏实的读者,发现《ASP.NET 3.5+SQL Server网站模块化开发全程实录》中第117页的一段实例代码:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
public partial class upLoadFile : System.Web.UI.Page
{
protected void UpLoadFile_Click(Object sender, EventArgs e)
{
FileSize.InnerHtml = UpLoadFile.PostedFile.ContentLength.ToString();
//获取上传文件名
String theFileDir = UpLoadFile.PostedFile.FileName;//获取文件名的完整路径
}
}
经过这位朋友的严格跟踪测试,发现PostedFile.FileName并不是“获取文件名的完整路径”,而只是文件名。
起初我也愣了一下,于是赶紧测试,发现确实是文件名,而不是完整路径。但是在我记忆中,非常确定这个方法是可以获取到完整路径的。于是静下心来一想,真相只有一个——浏览器!
着手验证。
上传本地物理路径的文件D:/testupload.jpg。
用IE7/IE8获取PostedFile.FileName结果如下:testupload.jpg。
用IE6获取PostedFile.FileName结果如下:D:/testupload.jpg。
同时使用HttpWatch跟踪了一下,发现从Post的环节上,就已经显现出上述差别:
IE7/8:filename="testupload.jpg" Content-Type: image/pjpeg
IE6:filename="D:/testupload.jpg" Content-Type: image/pjpeg
于是问题已经本明了了:不同的浏览器对于post<input type="file" />的值(一般这个值中包含了两个信息,分别是[路径+]文件名以及ContentType)有所差别(其本质除了浏览器的行为因素外,还有默认安全设置的问题)。
因此得出一个更加周全的处理建议:使用FileUpload控件在获取文件名的时候,尽量使用 Path.GetFileName(UpLoadFile.PostedFile.FileName)这样的方法,将其视同完整路径来处理,这样可以使任何浏览器下面都能得到正确的文件名,而不会包含路径(书本中用了一个比较繁琐的过程过滤路径,仅供学习之用:))。
起先我在本机很容易就获取了完整的路径,不过经过几位asp.net开发朋友的提示,发现远程访问的时候还是会有问题,看来这确实是件难事了,不过这本身也就是浏览器安全性的体现
本文来自: IT知道网(http://www.itwis.com) 详细出处参考:http://www.itwis.com/html/net/net20/20100113/7236.html
本文探讨了在ASP.NET中使用UpLoadFile.PostedFile.FileName方法获取文件路径的问题。发现不同浏览器(如IE6与IE8)返回的结果不一致,IE6返回完整路径而IE8仅返回文件名。文章提供了兼容所有浏览器的解决方案。
1176

被折叠的 条评论
为什么被折叠?



