簡體   English   中英

在 ASP.NET MVC (C#) 上提供靜態文件

[英]Serving static file on ASP.NET MVC (C#)

我是 .NET 框架的新手,我想知道提供靜態內容和訪問用戶生成內容的最佳方式是什么。

假設我有以下文件:

logo.jpg
document.pdf
etc.doc

我應該把它放在哪里(在哪個文件夾上)? 我如何訪問它?

最后,把它帶到另一個層次。 假設我有一個允許用戶上傳文檔的網絡應用程序(比如一些圖片)。 我想知道的是我的文件夾/目錄的結構應該是什么樣的?

通常在 django/CI 中,我會有一個如下文件夾:

應用程序/{all-web-app-related-folder-and-file-goes-here} 上傳/{all-related-user-generated-content-goes-here-categorized-by-file-type} assets/{css -javascript-document-would-go-here}

注意:我沒有做任何事情或嘗試做任何事情。 僅僅因為我不知道如何訪問嘗試靜態內容。 我曾經嘗試訪問位於 Content/Scripts 文件夾中的 *.css 或 *.js 文件。

即:本地主機:12345/Scripts/jquery.js

事實證明,這在 ASP.NET MVC 中並不是一個簡單的過程

哦,順便說一句,在某些情況下,我還想從我的 css 文件中訪問我的圖像。 這給我帶來了另一個困惑。

編輯 1:我閱讀了以下文章

http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/working-with-images-in-Asp-Net-mvc-framework/

但是它不適用於我當前的 MVC 版本(我使用的是 MVC 5)

編輯 2 :所以,這是我迄今為止一直在試驗的

  1. 我在根目錄(與模型、控制器等相同級別)創建了一個名為Assets的文件夾。
  2. 在資產內部我創建子文件夾(即圖像、文檔等)
  3. 然后我想直接從我的視圖中訪問這些文件,我會這樣:

    img src="@Url.Content("~/Asset/images/picture.png")"

如果我想訪問圖像文件,上面的例子是合適的。

但是,我不確定這是否是理想的方法。 然而,這是我目前能遇到的最簡單的解決方案(或者我應該說,相當天真)。

任何提示將不勝感激。

假設我有以下文件:logo.jpg、document.pdf 等.doc,我應該把它放在哪里(在哪個文件夾上)? 我如何訪問它?

您在 EDIT 2 上的內容完全沒問題。 MVC 框架足夠智能,可以禁用字典瀏覽。 如果您嘗試資產/assets//assets/images ,您將獲得 403。

此外,即使您有一個名為“assets”的控制器、一個名為“images”的方法和一個字符串 id“picture.png”,請求也不會命中控制器方法。 相反,它仍然會為您提供圖像文件。 看起來 MVC 優先於它找到的靜態文件而不是 MVC 路由?


假設我有一個允許用戶上傳文檔的網絡應用程序(比如一些圖片)。 我想知道的是我的文件夾/目錄的結構應該是什么樣的?

如果您打算僅將用戶上傳的內容作為物理文件存儲在應用程序中(而不是將它們保存到持久性存儲中),您可以在根目錄上創建一個類似於“上傳”的文件夾並將其上傳內容放在那里。

我會通過他們的 ID(希望它是一個 GUID 而不僅僅是整數 ID)將他們的上傳分開到“上傳”下的不同子文件夾中,以防萬一你想在前端顯示上傳路徑,用戶無法輕易猜到其他用戶上傳的是:

// assets
// uploads
//     xxxx-xxxx-xxxx-xxxx
//         files
//     xxxx-xxxx-xxxx-xxxx
//         files

不要忘記在您發布應用程序的服務器上設置此上傳​​文件夾的權限。


在某些情況下,我還想從我的 css 文件中訪問我的圖像。

在這種情況下,您將不得不使用相對 URL,並且 MVC 將其根目錄默認為~/Content 例如,假設您想使用保存在 /assets/images/ 下的圖片.png 作為塊的背景圖片:

#test-block {
    width: 250px;
    height: 250px;
    background-image: url(`~/assets/images/picture.png`);'
    background-size: cover;
}

您認為它會正確訪問圖片並將其用作塊的背景。 但實際上,它會生成如下內容:

background-image: localhost/content/~/assets/images/picture.png

這是一個無賴,因為您必須手動返回 1 級以獲取圖像,使用../而不是~/

background-image: url(`../assets/images/picture.png`);'

對我來說,這不是一個可以接受的解決方案,如果您將應用程序發布到服務器上的虛擬文件夾(而不是 wwwroot),那將會很麻煩。

為了設置這樣的背景圖像,我更喜歡在@Url.Content()的幫助下使用內聯樣式,因為我不需要擔心它們的路徑是如何相互關聯的:

<div id="test-block" 
    style="background-image: url('@Url.Content("~/assets/images/picture.png")');">
</div>

ASP.NET MVC 默認允許靜態文件服務。 而不是使用@URL.Content 直接寫以 / 開頭的路徑,表示根文件夾

<img src="/Asset/images/picture.png" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM