2011-07-26 19 views
0

我想使用一個控制器作爲圖像處理程序,但我如何傳遞給它的路徑?Mvc 3 - 控制器作爲圖像處理程序,如何傳遞路徑?

現在它看起來像這樣(適用於圖像沒有路徑):

public void GetImage(string parameter) 
{ 
    var imageHandler = UnityGlobalContainer.Container.Resolve<IImageHandler>(); 
    imageHandler.ProcessRequest(parameter); 
} 

但如果我嘗試的路徑來發送的folder1 \文件夾2 \ folder3 \ picture.jpg那麼它失敗。

@Html.ActionLink("Show", "GetImage", "Utility", new { parameter = @"folder1\folder2\folder3\picture.jpg" }, new { }) 

產生這樣的: http://localhost:58359/Utility/GetImage/folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg

,並導致: HTTP錯誤400 - 錯誤的請求。

我如何傳遞一個路徑到控制器使用正常的mvc方法? (我正在使用反斜槓而不是正斜槓) 我也測試過在參數上使用HttpUtility.UrlEncode。

回答

2

根據您的代碼:在HTML頁面中的鏈接產生的應該是: http://localhost:58359/Utility/GetImage?parameter=folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg 和參數變量應當正確地設置爲「文件夾1 \文件夾2 \ folder3 \ picture.jpg」的操作方法。

請注意,您可能在這裏容易受到directory traversal的影響。

+0

這不符合mvc路徑嗎? – Patrick

+0

對不起,沒有得到你mvc pathing的意思。你可以添加由視圖生成的網址(查看呈現頁面的HTML源代碼)和控制器方法中的變量「參數」的值(只需設置一個斷點)?另外,你有GetImage行動的特殊路線嗎? – nakhli

0

在.NET 4.0 beta 2中,CLR團隊提供了一種解決方法。

添加到您的web.config文件:

<uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> 
    </schemeSettings> 
</uri> 

這將導致Uri類根據描述的URI RFC的行爲,允許斜槓的路徑進行轉義,而不被轉義。 CLR團隊報告他們出於安全原因而偏離了規範,並且在您的.config文件中進行設置基本上可以讓您在未解決斜槓問題的過程中掌握所涉及的其他安全問題。

0

而不是調用的文件名參數「參數」,並在你的路線定義它的,稱之爲「文件名」,並在您的路線不定義它。

你的動作代碼將是相同的,但文件名將停止成爲路由的一部分,只是一個普通的URL參數。

如果你不喜歡這個季節的不喜歡URL參數的時尚,那麼你可能會發現這種令人反感的,但這只是時尚,可以安全地被忽略。個人而言,我不會將這樣的路徑傳遞到Web應用程序中,因爲我會錯誤地創建遍歷威脅 - 我只會傳入無路徑文件名,根據列表驗證它們,然後獲取它們文件。

相關問題