当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net Server.MapPath方法注意事项

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

ASP.NET 中的 asp.net Server.MapPath方法注意事项


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 398 ::
收藏到网摘: n/a

当我发布之后,对存储图片的文件夹创建了虚拟目录,并赋予该目录写入的权限,但是,当我上传图片的时候,总是失败。以前没遇到过这种情况,觉得很是怪异,所以想尽办法去解决。 在做一个客户推广系统的时候,里面有一个模板管理模块,需要管理员添加模板,包括模板的名称、说明和缩略图等,在这里上传图片的功能,我采用了比较传统的方法,进行上传,测试没有问题。但当我发布之后,对存储图片的文件夹创建了虚拟目录,并赋予该目录写入的权限,但是,当我上传图片的时候,总是失败。以前没遇到过这种情况,觉得很是怪异,所以想尽办法去解决。
首先,检查上传目录的权限,我添加了NetWork Service用户的写入、修改权限,结果还是失败,然后我将权限设置为EveryOne还是失败,看来不是权限的问题。
然后,将虚拟目录删除,并在应用程序目录下重新建立了存储图片的文件夹(发布前已经删除),并赋予其写入权限,结果上传成功,也能够正常显示。
接着,我又将上传的图片copy到原来建立的虚拟目录下面,并重新建立了虚拟目录,结果显示成功。
经过这些检查和设想工作,我总结了一下,文件真的能够上传,也能够正常显示,看来是上传时候的目录和虚拟目录间的转换出现问题,然后我继续审查我写的代码。
当前的简略代码,其中Upload即为图片的存储目录,也是我创建虚拟目录的地方,而Spread是其上层目录。 我突然发现,原来Server.Mappath并没有指向图片存储的根目录,感觉有些怪怪的,然后就进行了修改。
复制代码 代码如下:
由于自己的疏忽出现了这个怪问题,但是为什么会出现这样的事情呢。我又进行了深入研究。
Server.MapPath方法
返回Web服务器上指定虚拟路径相对应的物理文件路径。
如果通过这个方法能够得到目录的物理路径,那么
Server.MapPath("~/Spread")+"/Upload"和Server.MapPath("~/spread/Upload"),也没有区别啊。为什么会产生不同的效果呢?而实际的结果是,这两者的路径并不相同。
前者返回的是Upload的原路径,而后者返回的是Upload指向的虚拟路径。如果真是这样,那么疑问就已经揭开了。
于是我做了一个小小的测试程序。
测试程序
建立一个测试用例,在根目录下创建BBS目录,然后在BBS目录下创建Upload目录,在用例发布后,首先测试返回的结果,然后将Upload建立虚拟目录,指向其它的物理路径,查看返回的值。
主程序:
复制代码 代码如下:

protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = Context.Server.MapPath("~/BBS/")+"Upload";
Label2.Text = Context.Server.MapPath("~/BBS/Upload");
}

测试结果:
结果证实了推出的结论,的确,Server.MapPath返回的是虚拟路径的物理地址。哎,其实其定义本来就是这样了,不过有的时候就是不碰南墙不死心。
但是还有一个问题:
在上传成功的图片,在显示的时候,路径绑定的是相对路径,用一个Image控件显示,其图片地址如:“~/Spread/Upload/080826094153.jpg”,但是当你将该图片放到虚拟目录中去,将以前的Upload目录给删除,也能够正常显示,而这里并没有用到Server.MapPath。这个问题又把我搞糊涂了,难道IIS自动能够识别其虚拟目录的地址?但是如果是这样,为什么上传的时候,则没有识别出来?
--------------------------------------------------------------------------------
谢谢大家的意见,本问题已经得以及解决。
教训:
<1>注意基本方法的正确理解
<2>在上传文件时,如果需要对其存储目录建立虚拟目录,那么Server.MapPath参数应该是此目录。
<3>一定要注意页面缓存带来的烦扰