36

我有一个专门的案例,我希望从控制器操作中提供一个直接的 html 文件。

我想从 Views 文件夹以外的其他文件夹提供它。该文件位于

Solution\Html\index.htm

我想通过标准的控制器动作来服务它。我可以使用返回文件吗?我该怎么做?

4

6 回答 6

48

看一下这个 :

    public ActionResult Index()
    {
        return new FilePathResult("~/Html/index.htm", "text/html");
    }
于 2012-05-31T10:54:22.217 回答
43

如果你想在浏览器中呈现这个 index.htm 文件,那么你可以像这样创建控制器动作:

public void GetHtml()
{
    var encoding = new System.Text.UTF8Encoding();
    var htm = System.IO.File.ReadAllText(Server.MapPath("/Solution/Html/") + "index.htm", encoding);
    byte[] data = encoding.GetBytes(htm);
    Response.OutputStream.Write(data, 0, data.Length);
    Response.OutputStream.Flush();
}

或者只是:

public ActionResult GetHtml()
{
    return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html"); 
}

所以假设这个动作在Home控制器中,一些用户点击http://yoursite.com/Home/GetHtml然后 index.htm 将被渲染。

编辑:其他2种方法

如果您想在浏览器中查看index.htm的原始 html :

public ActionResult GetHtml()
{
    Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition { Inline = true, FileName = "index.htm"}.ToString());
    return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/plain"); 
}

如果您只想下载文件:

public FilePathResult GetHtml()
{
    return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html", "index.htm"); 
}
于 2012-05-31T09:30:21.420 回答
8

我扩展了 wahid 的答案以创建 HtmlResult

创建扩展 FilePathResult 的 Html 结果

public class HtmlResult : FilePathResult
{
    public HtmlResult(string path)
        : base(path, "text/html")
    {
    }
}

在控制器上创建静态方法

public static HtmlResult Html(this Controller controller, string path)
{
    return new HtmlResult(path);
}

像我们返回视图一样使用

public HtmlResult Index()
{
    return this.Html("~/Index.html");
}

希望能帮助到你

于 2013-05-04T20:39:59.617 回答
1

我想把我的两分钱放进去。我发现这个最简洁,它已经在那里了:

public ActionResult Index()
{
     var encoding = new System.Text.UTF8Encoding();
     var html = ""; //get it from file, from blob or whatever
     return this.Content(html, "text/html; charset=utf-8");
}
于 2017-05-31T09:01:50.687 回答
0

您可以读取字符串中的 html 文件并将其返回吗?它呈现为 Html 页面,如下所示:

public string GetHtmlFile(string file)
{
    file = Server.MapPath("~/" + file);
    StreamReader streamReader = new StreamReader(file);
    string text = streamReader.ReadToEnd();
    streamReader.Close();
    return text;
}

主页/GetHtmlFile?file=Solution\Html\index.htm

如果 HTML 文件的目标或存储机制很复杂,那么您可以使用虚拟路径提供程序

虚拟路径提供程序 MVC 示例

于 2012-05-31T09:29:13.887 回答
0

如果使用 .net 核心,另一种方法是使用 FileProvider。这些文件可以在文件夹中或在编译时嵌入。

在本例中,我们将使用嵌入文件。

在你的项目中添加一个文件夹,比如说资产,在其中创建一个文件 myfile.html,向文件中添加一些基本的 html 说

<html>
<head>
  <title>Test</title>
</head>
<body>
   Hello World
</body>
</html>

右键单击新文件(假设您在 Visual Studio 中)选择属性,在属性屏幕/构建操作中,选择嵌入式资源。它会将文件添加到 csproj 文件中。

右键单击您的项目,编辑您的 csproj 文件。检查您的属性组是否包含以下内容:

<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>

如果没有请添加。csproj 还应包含新创建的 html 文件,如下所示:

  <ItemGroup>
    <EmbeddedResource Include="assets\myfile.html" />
  </ItemGroup>

要读取控制器中的文件并将其传递给客户端,需要将文件提供程序添加到 startup.cs

编辑您的 startup.cs 确保它包含 HostingEnvironment:

private readonly IHostingEnvironment HostingEnvironment;
public Startup(IHostingEnvironment hostingEnvironment)
{
     HostingEnvironment = hostingEnvironment;
}

然后创建一个文件提供者并使其成为可以在运行时注入的服务。如下创建它:

 var physicalProvider = HostingEnvironment.ContentRootFileProvider;
 var manifestEmbeddedProvider =
      new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
 var compositeProvider =
      new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

 services.AddSingleton<IFileProvider>(compositeProvider);

要将文件提供给您的控制器,请使用依赖注入来获取 FileProvider,创建新服务并提供文件。为此,从依赖注入开始,将提供程序添加到您的构造函数中。

IFileProvider _fileProvider;
public MyController(IFileProvider fileProvider)
{
    this._fileProvider = fileProvider;
}

然后在您的服务中使用文件提供程序

[HttpGet("/myfile")]
[Produces("text/html")]
public Stream GetMyFile()
{
   // Use GetFileInfo to get details on the file passing in the path added to the csproj
   // Using the fileInfo returned create a stream and return it.
   IFileInfo fileinfo = _fileProvider.GetFileInfo("assets/myfile.html");
   return fileinfo.CreateReadStream();
}

有关详细信息,请参阅此处的 ASP .Net Core 文件提供程序示例和 Microsoft 文档。

于 2019-01-15T09:14:33.273 回答