【问题标题】:Is it possible to return an img to <img src=""> without serving it as static?是否可以将 img 返回到 <img src=""> 而不将其作为静态服务?
【发布时间】:2018-12-08 04:06:13
【问题描述】:

现在我正在用 C# 从控制器返回图像

返回文件(字节,“图像/JPEG”);

它工作正常,但它实际上返回文件。同时,我想返回将在页面上显示的图像 但不使它们成为静态的(因此,如果用户提供其他人的 url,那么他必须登录才能能够访问它们)。

我设法找到的唯一方法是 Base64 编码,它工作正常,但当 img 大小增加时,它似乎对浏览器有点滞后。

也许这是某种将图像注入 .cshtml 但听起来像Base64

【问题讨论】:

  • 网络服务器不是由魔法驱动的。您可以为较少的请求支付较高的初始负载(使用 base64 嵌入式图像),使用静态文件或从控制器动态返回它们。您应该尽可能使用静态文件,因为您可以使用 CDN 来提高加载速度(当静态文件位于不同域时,浏览器可以打开更多连接)并且静态文件域可以少 cookie,从而减少发送 cookie 的开销每个请求
  • @Tseng Either you pay the higher initial load (with base64 embedded image) for lesser requests, use static files or return them dynamically from controller. base64,静态文件,第三个是什么? “动态返回”?通过javascript?反正。我的目标是仅向授权用户提供图像(我正在控制器中验证),所以我很好奇这是否可能
  • 1. base 64, 2. 静态文件 3. 来自控制器的动态文件(通过从文件系统或数据库流式传输文件)

标签: c# html asp.net-core


【解决方案1】:

在您的控制器中,您有这样的操作(正如您所描述的那样):

public class PhotoController : Controller {
    public ActionResult GetPhoto() {
        ...
        return File(bytes, "image/jpeg");
    }
}

如果您只是从文件系统中提取文件,您可以这样做(如果文件在您的网站文件夹中):

return File("~/images/" + name, "image/jpeg");

或者如果文件不在您的网站文件夹中:

return PhysicalFile("C:\\images\\" + name, "image/jpeg");

然后在您的页面中,您有一个图像,其源指向该操作:

<img src="@Url.Action("GetPhoto", "Photo")">

【讨论】:

  • 如果你从静态文件中提取,你可以给它文件的路径,它会处理其余的:return File(filename, "image/jpeg");
  • var bytes = System.IO.File.ReadAllBytes("C:\\images\\" + name); return File(bytes, "image/jpeg"); - 工作正常,同时 return File("C:\\images\\" + name, "image/jpeg"); 不行。例外:An unhandled exception occurred while processing the request. FileNotFoundException: Could not find file: C:\images\1.jpg 出于某种原因...
  • 可能需要创建一个虚拟目录。
  • 哦,我明白了。 File() 需要相对于 wwwroot 文件夹的路径(例如 File("~/images/1.jpg")。但如果路径在网站文件夹之外,您可以使用 PhysicalFile()(例如 return PhysicalFile("C:\\images\\" + name, "image/jpeg");
【解决方案2】:

您为仍然只返回图像文件的图像创建一个单独的“页面”。页面根据用户和 URL 知道要显示哪个图像以及是否显示。所以你可能有一个 Images.aspx 页面和路由映射到你的页面,如下所示:

/images/{imageID}

可以翻译成Images.apsx?ImageID={imageID}。此“页面”不返回任何 html……仅返回图像,内容类型为 image/jpeg。然后主页中的 html &lt;img 元素的 src 属性可以指向您的新路由。

无论您做什么,重要的是要了解您使用的是 HTTP 的请求/响应模型。页面中的 &lt;img 元素应通过完全独立的 HTTP 请求提供,而不是作为提供 html 的同一请求的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多