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



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

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

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

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

但如果我不知道它的扩展,我不知道该怎么办。如何在不知道文件扩展名但只知道文件名的情况下获取文件?提前谢谢。

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

下面是一个快速工作的简单示例。请随意编辑它,使其个性化&坚固耐用。

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方法。通过在RouteConfig.csRegisterRoutes方法内调用MapMvcAttributeRoutes方法,确保已启用属性路由。

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. 探索缓存选项,看看如何让您的体验更快

最新更新