Как получить файл, не зная его расширения - ASP.NET MVC - PullRequest
0 голосов
/ 04 ноября 2018

В папке «Изображения» на сервере есть файл.

Имя файла - "jason", но я не знаю, является ли он "jason.pdf" или "jason.jpg" или "jason.png" .. Однако файл должен иметь одно из следующих расширений: " .pdf, .png, .jpg ". Другого варианта нет.

Я знаю, что могу получить такой файл, если знаю, что его расширение ".pdf":

<a href="~/Images/jason.pdf">File</a>

Но я не знаю, что делать, если я не знаю его расширения. Как я могу получить файл, не зная его расширения, но зная только имя файла? Заранее спасибо.

1 Ответ

0 голосов
/ 04 ноября 2018

Вы можете подумать о создании действия контроллера, которое обслуживает эти файлы.

Вот простой быстрый пример. Не стесняйтесь редактировать его, чтобы сделать его более изощренным и надежным.

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           
    }
}

Несколько вещей для рассмотрения

  1. Приведенная выше простая реализация читает все файлы в каталоге Images каждый раз, когда вызывается метод действия. Вы должны рассмотреть возможность кэширования результатов (список имен файлов, возвращаемое значение GetFiles), чтобы избежать повторного вызова. Вы можете сохранить его в кэш-памяти / базе данных и т. Д.

  2. Если пользователь передает имя файла, которого нет в местоположении, что вы хотите вернуть. Приведенный выше метод GetFilePath возвращает string.empty в этом случае. Обрабатывать его внутри метода GetFile.

  3. Метод Directory.GetFiles имеет перегрузку, которая принимает шаблон поиска. Вы можете использовать это и полностью избавиться от цикла foreach.
  4. Если вы обслуживаете статический файл (например: /images/file.jpg), IIS будет обслуживать файл (без выполнения кода MVC. Это будет быстрее).
  5. Изучите параметры кэширования и узнайте, как это может сделать ваш опыт еще быстрее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...