【问题标题】:Return image from file system从文件系统返回图像
【发布时间】:2016-09-04 07:24:54
【问题描述】:

文件系统中有成功上传的图像,我想访问它。所以,我写了GET-method

[HttpGet]
public ActionResult Get(string id) {
    var path = $@"d:\smth\upload\{id}.jpeg";
    return File(path, "image/jpeg");
}

我完全确定在所需路径中存在具有所需名称的文件,但任何时候尝试创建 File(path, "image/jpeg") 我都会得到 Could no find file 异常。好像我无权访问wwwroot 之外的文件夹。也许我错过了working with static file article 的重要内容?

那么,谁能解释一下如何通过GET-method 返回存储在网络服务器文件夹外的文件系统中的图像

【问题讨论】:

  • 下次请使用正确的标签,以获得正确的答案! asp.net-mvc 标签适用于旧的 MVC webstack!为 ASP.NET Core MVC 使用 asp.net-core-mvc!!

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

虽然@Shyju 说的是真的并且File 辅助方法不接受物理文件路径,但PhysicalFile 辅助方法可以(请参阅GitHub source)。

[HttpGet]
public ActionResult Get(string id) {
    var path = $@"d:\smth\upload\{id}.jpeg";
    return PhysicalFile(path, "image/jpeg");
}

【讨论】:

    【解决方案2】:

    File 方法没有占用物理位置的重载。有一个采用虚拟路径,您的图像应位于网络应用根目录下。

    但是您可以将 another overload 用于您的用例。这将一个字节数组作为File 方法的第一个参数。您可以从可访问的物理目录中读取文件(假设您的文件存在)并将其转换为字节数组并将其传递给 File 方法。

    [HttpGet]
    public ActionResult Get(string id)
    {
       var path = $@"d:\smth\upload\{id}.jpeg";
       byte[] bytes = System.IO.File.ReadAllBytes(path);
       return File(bytes, "image/jpeg");
    }
    

    【讨论】:

    • 顺便说一句。引用的 MSDN 文章是关于 ASP.NET MVC 的(你可以在 System.Web.* 命名空间上看到它),而不是 ASP.NET Core MVC,它是对 webstack 的完全重写,它不依赖于 System.Web .*(因此不依赖 IIS)
    【解决方案3】:

    如果可以,您不能,这意味着外部世界的每个人都可以制作 GET/POST 表单并访问公用文件夹之外的文件。如果有人将文件上传到您的网络服务器,它应该位于您的 tmp 目录中,您应该可以使用 asp 访问该目录。

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2014-09-25
      • 2018-12-24
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      相关资源
      最近更新 更多