如何在不知道其扩展名的情况下获取文件-ASP.NET MVC

时间:2018-11-04 19:10:58

标签: html asp.net asp.net-mvc file

服务器中的文件夹“ Images”中有一个文件。

该文件的名称为“ jason”,但我不知道它是“ jason.pdf”还是“ jason.jpg”或“ jason.png”。但是,该文件必须具有以下扩展名之一:“ .pdf,.png,.jpg”。没有其他选择。

我知道如果我知道它的扩展名是“ .pdf”,就可以得到这样的文件:

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

但是,如果我不知道扩展名,我不知道该怎么办。如何在不知道其扩展名但仅知道文件名的情况下获取文件?预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以考虑创建为您提供这些文件的控制器操作。

这里是一个快速简单的示例。随时对其进行编辑,以使其根据需要变得复杂且强大。

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的{​​{1}}方法内调用RegisterRoutes方法,确保已启用属性路由。

RouteConfig.cs

没什么要考虑的

  1. 上面的简单实现是每次调用action方法时都读取Images目录中的所有文件。您应该考虑缓存(文件名列表,返回值public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); //Existing default route defnition goes here } } 的结果),以便避免一直调用。您可以将其存储在内存缓存/数据库等中。

  2. 如果用户传递的文件名在该位置不存在,则要返回什么。在这种情况下,上述GetFiles方法将返回GetFilePath。在string.empty方法中处理它。

  3. GetFile方法有一个采用搜索模式的重载。您可以考虑使用它并完全摆脱Directory.GetFiles循环。
  4. 如果您正在提供静态文件(例如:foreach),则IIS将为该文件提供服务(不执行任何MVC代码。这样会更快)。
  5. 浏览缓存选项,看看如何使您的体验更快。