Вы можете подумать о создании действия контроллера, которое обслуживает эти файлы.
Вот простой быстрый пример. Не стесняйтесь редактировать его, чтобы сделать его более изощренным и надежным.
public class ImageController:Controller
{
private string GetFilePath(string fileName)
{
var path = Server.MapPath(Url.Content("~/Images"));
//Getting all the files present in this directory
var files = Directory.GetFiles(path);
// Loop through each items(filenames) and check the filename(without extension)
// is matching with our method parameter value
foreach(var file in files)
{
if(Path.GetFileNameWithoutExtension(file)
.Equals(fileName,StringComparison.OrdinalIgnoreCase))
{
return file;
}
}
return string.Empty;
}
[Route("image/{fileName}")]
public ActionResult GetFile(string fileName)
{
var path = GetFilePath(fileName);
// to do : handle if path is string.empty
// may be return default content/file ?
var contentType = MimeMapping.GetMimeMapping(path);
byte[] bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, contentType);
}
}
Теперь, с другой стороны, вы будете называть это
<a href="~/Image/jason">PDF File</a>
или
<a href="~/Image/puppy">Image file name</a>
Здесь мы используем маршрутизацию атрибутов для нашего метода, чтобы запрос к /image/{filename}
был сопоставлен с методом GetFile
. Убедитесь, что у вас включена маршрутизация атрибутов, вызвав метод MapMvcAttributeRoutes
внутри RegisterRoutes
метод RouteConfig.cs
.
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
//Existing default route defnition goes here
}
}
Несколько вещей для рассмотрения
Приведенная выше простая реализация читает все файлы в каталоге Images каждый раз, когда вызывается метод действия. Вы должны рассмотреть возможность кэширования результатов (список имен файлов, возвращаемое значение GetFiles
), чтобы избежать повторного вызова. Вы можете сохранить его в кэш-памяти / базе данных и т. Д.
Если пользователь передает имя файла, которого нет в местоположении, что вы хотите вернуть. Приведенный выше метод GetFilePath
возвращает string.empty
в этом случае. Обрабатывать его внутри метода GetFile
.
- Метод
Directory.GetFiles
имеет перегрузку, которая принимает шаблон поиска. Вы можете использовать это и полностью избавиться от цикла foreach
.
- Если вы обслуживаете статический файл (например:
/images/file.jpg
), IIS будет обслуживать файл (без выполнения кода MVC. Это будет быстрее).
- Изучите параметры кэширования и узнайте, как это может сделать ваш опыт еще быстрее.