国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net Server.MapPath方法注意事項第1/2頁

2024-07-10 13:21:40
字體:
來源:轉載
供稿:網友
在做一個客戶推廣系統的時候,里面有一個模板管理模塊,需要管理員添加模板,包括模板的名稱、說明和縮略圖等,在這里上傳圖片的功能,我采用了比較傳統的方法,進行上傳,測試沒有問題。但當我發布之后,對存儲圖片的文件夾創建了虛擬目錄,并賦予該目錄寫入的權限,但是,當我上傳圖片的時候,總是失敗。以前沒遇到過這種情況,覺得很是怪異,所以想盡辦法去解決。

首先,檢查上傳目錄的權限,我添加了NetWork Service用戶的寫入、修改權限,結果還是失敗,然后我將權限設置為EveryOne還是失敗,看來不是權限的問題。

然后,將虛擬目錄刪除,并在應用程序目錄下重新建立了存儲圖片的文件夾(發布前已經刪除),并賦予其寫入權限,結果上傳成功,也能夠正常顯示。

接著,我又將上傳的圖片copy到原來建立的虛擬目錄下面,并重新建立了虛擬目錄,結果顯示成功。

經過這些檢查和設想工作,我總結了一下,文件真的能夠上傳,也能夠正常顯示,看來是上傳時候的目錄和虛擬目錄間的轉換出現問題,然后我繼續審查我寫的代碼。

當前的簡略代碼,其中Upload即為圖片的存儲目錄,也是我創建虛擬目錄的地方,而Spread是其上層目錄。 我突然發現,原來Server.Mappath并沒有指向圖片存儲的根目錄,感覺有些怪怪的,然后就進行了修改。

復制代碼 代碼如下:


string fullName = this.FileUpload2.PostedFile.FileName;
string type = fullName.Substring(fullName.LastIndexOf('.') + 1);
if (!PhotoTypes.IsExist(type.ToLower()))
{
Bmc.CLUtility.ShowMessage(this.Page, "只能上傳JPEG、JPE、GIF、BMP、PNG格式的圖片!");
return;
}
string fileName ="Upload/"+ System.DateTime.Now.ToString("yyMMddhhmmss") + "." + type;
try
{
string temp = Server.MapPath("~/Spread");
this.FileUpload2.PostedFile.SaveAs(temp + "http://m.survivalescaperooms.com/" + fileName);
this.Image2.ImageUrl = "~/Spread/" + fileName;
this.Image2.Visible = true;
}
catch
{
Bmc.CLUtility.ShowMessage(this.Page, "上傳文件失??!");
}


修改后的代碼如下,結果能夠正常上傳和顯示,看來問題的確處在這里。

復制代碼 代碼如下:


string fullName = this.FileUpload2.PostedFile.FileName;
string type = fullName.Substring(fullName.LastIndexOf('.') + 1);
if (!PhotoTypes.IsExist(type.ToLower()))
{
Bmc.CLUtility.ShowMessage(this.Page, "只能上傳JPEG、JPE、GIF、BMP、PNG格式的圖片!");
return;
}
string fileName = System.DateTime.Now.ToString("yyMMddhhmmss") + "." + type;
try
{
string temp = Server.MapPath("~/Spread/Upload");
this.FileUpload2.PostedFile.SaveAs(temp + "http://m.survivalescaperooms.com/" + fileName);
this.Image2.ImageUrl = "~/Spread/Upload/" + fileName;
this.Image2.Visible = true;
}
catch
{
Bmc.CLUtility.ShowMessage(this.Page, "上傳文件失?。?);
}



由于自己的疏忽出現了這個怪問題,但是為什么會出現這樣的事情呢。我又進行了深入研究。

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>一定要注意頁面緩存帶來的煩擾

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 珲春市| 东兰县| 望江县| 林甸县| 南安市| 锦州市| 墨江| 南陵县| 洪泽县| 灵武市| 古交市| 鸡东县| 温宿县| 临高县| 五华县| 民县| 金山区| 闻喜县| 平谷区| 宣威市| 常山县| 保山市| 阿勒泰市| 黄石市| 武川县| 新泰市| 临沂市| 肥东县| 柏乡县| 崇明县| 洛隆县| 什邡市| 东明县| 文安县| 金阳县| 鹤岗市| 郧西县| 固镇县| 石景山区| 屯门区| 隆子县|